Подтвердить что ты не робот

Ошибка при создании нового объекта из существующего с помощью `...`: в этой среде источники для назначения ДОЛЖНЫ быть объектом

В моем приложении React Native у меня есть ситуация, когда один конкретный ребенок компонента, который я render должен получать либо зеленый, либо красный borderColor.

Теперь я не хочу создавать две отдельные записи в моей styles для этих двух ситуаций, так как они отличаются только свойством borderColor.

Моя идея состояла в том, чтобы получить правильный объект стиля из тех, которые у меня есть в моем styles, например:

const styles = StyleSheet.create({
  amountSection: {
    borderWidth: 1,
    flex: 1,
    flexDirection: 'row',
    borderRadius: 3
  }
})

render() {
  const amountBorderColor = this.state.isClaim ? 'green' : 'red'
  const amountStyles = {
    ...styles.amountSection,
    borderColor: amountBorderColor
  }

  return (
    // ... apply amountStyles at appropriate component
  )
}

Однако этот код дает следующую ошибку:

Необработанное исключение JS: в этой среде источники для назначения ДОЛЖЕН быть объектом. Эта ошибка - это оптимизация производительности, а не совместимый со спецификацией.

По-видимому, ошибка попадает на строку, где я определяю amountStyles. Кто-нибудь знает, почему это происходит? Что-то не так с моим синтаксисом? Я использую нотацию ... для создания нового объекта из существующего и добавляю к нему дополнительные свойства.

4b9b3361

Ответ 1

Как указывал @PitaJ, моя проблема заключалась в том, что StyleSheet.create не возвращает простой объект javascript, поэтому оператор ... не может быть применен.

Я хочу только добавить решение к моей исходной проблеме, это было бы создание двух разных объектов стиля из одного базового, в котором добавлено только одно свойство.

docs для API StyleSheet указывает, что для этого можно использовать метод flatten:

const amountBorderColor = this.state.isClaim ? 'green' : 'red'
const amountStyles = StyleSheet.flatten([styles.amountSection, {borderColor: amountBorderColor}])

Ответ 2

Похоже, что функция factory не возвращает объект JavaScript с требуемым свойством и что среда не хочет применять оператор спреда к значению undefined. Если вы хотите использовать его, вытащите объект, который вы передаете этой функции, в другую переменную.