В React вы можете четко создать объект и назначить его как встроенный стиль. то есть. упомянуто ниже.
var divStyle = {
color: 'white',
backgroundImage: 'url(' + imgUrl + ')',
WebkitTransition: 'all', // note the capital 'W' here
msTransition: 'all' // 'ms' is the only lowercase vendor prefix
};
var divStyle2 = {fontSize: '18px'};
React.render(<div style={divStyle}>Hello World!</div>, mountNode);
Как я могу объединить несколько объектов и назначить их вместе?
Ответы:
Если вы используете React Native, вы можете использовать обозначение массива:
Проверьте мой подробный пост в блоге об этом.
источник
<View style={this.state.error == false ? styles.base : [styles.base, {backgroundColor: 'red'}]} />
StyleSheet.compose()
вне функции рендеринга может быть более эффективным. Он создаст новую статическую таблицу стилей, которая будет передана по мосту только один раз. (Этот совет не относится к стилям, которые изменяются во время выполнения или являются встроенными вместо таблицы стилей.)Вы можете использовать оператор распространения:
источник
<div style={{ ...LEGEND_STYLE.box_base, ...{ 'background': '#123456' } }} />
<div style={LEGEND_STYLE.box_gen('#123456')}
, так что для меня это не имеет большого значенияВы можете сделать это с
Object.assign()
.В вашем примере вы бы сделали:
Это объединит два стиля. Второй стиль заменит первый, если есть соответствующие свойства.
Как заметил Брэндон, вы должны использовать его,
Object.assign({}, divStyle, divStyle2)
если хотите использовать повторноdivStyle
без применения fontSize.Мне нравится использовать это для создания компонентов со свойствами по умолчанию. Например, вот небольшой компонент без сохранения состояния по умолчанию
margin-right
:Таким образом, мы можем сделать что-то вроде этого:
Что даст нам результат:
источник
Object.assign()
по назначению, что приведет к нежелательным последствиям. Смотрите ответ здесь, более надежное решение.Object.assign()
в своем ответе. первое, в первых нескольких предложениях, является примером выявленного мною неправильного использования (т. е. если бы ОП выполнил то, что вы посоветовали в первомcode
блоке, он / она мутировал{divStyle}
). второй способ - то есть, завернуть его в функцию, как у вас, будет работать, но ответ не дает понять, что вы работаете надObject.assign()
«обычной« ошибкой »в отношении неизменности (хотя лично я думаю, что это немного неудобно писать пользовательскую функцию без сохранения состояния для каждого компонента по умолчанию).В отличие от React Native, мы не можем передать массив стилей в React, например
В React нам нужно создать отдельный объект стилей перед передачей его в свойство style. Подобно:
Мы использовали оператор ES6 Spread для объединения двух стилей. Вы также можете использовать Object.assign () для той же цели.
Это также работает, если вам не нужно хранить свой стиль в var
источник
Object.assign()
это простое решение, но его использование (в настоящее время) является лучшим ответом - хотя оно прекрасно подходит для создания компонентов без состояния, но вызовет проблемы для желаемой цели OP - объединение двухstate
объектов.С двумя аргументами
Object.assign()
будет фактически мутировать первый объект на месте, влияя на будущие экземпляры.Пример:
Рассмотрим две возможные конфигурации стилей для коробки:
Таким образом, мы хотим, чтобы все наши блоки имели стили «по умолчанию», но хотим перезаписать их другим цветом:
После
Object.assign()
выполнения объект 'styles.box' изменяется навсегда.Решение состоит в том, чтобы передать пустой объект
Object.assign()
. При этом вы говорите методу для создания нового объекта с объектами, которые вы передаете ему. Вот так:Это понятие объектов, мутирующих на месте, является критическим для React, и правильное использование
Object.assign()
действительно полезно для использования таких библиотек, как Redux.источник
Array notaion - лучший способ сочетания стилей в реагировать на нативные.
Это показывает, как объединить 2 объекта стиля,
это показывает, как объединить объект и свойство стиля,
Это будет работать на любое реагирующее нативное приложение.
источник
React
, а не дляReact Native
Вы также можете комбинировать классы со встроенным стилем так:
источник
На самом деле, есть формальный способ объединения, и это как ниже:
Но есть небольшая проблема , если один из них передается родительским компонентом, и он был создан комбинированным формальным способом, у нас есть большая проблема:
И эта последняя строка вызывает ошибку пользовательского интерфейса, React Native не может работать с глубоким массивом внутри массива. Итак, я создаю свою вспомогательную функцию:
Используя мой
styleJoiner
где угодно, вы можете комбинировать любые стили и сочетать стили. дажеundefined
или другие бесполезные типы не приводят к нарушению стиля.источник
Я обнаружил, что это работает лучше всего для меня. Это переопределяет, как и ожидалось.
источник
Для тех, кто ищет это решение в React, если вы хотите использовать оператор распространения внутри стиля, вы должны использовать: babel-plugin-transform-object-rest-spread.
Установите его с помощью модуля npm и настройте ваш .babelrc следующим образом:
Тогда вы можете использовать как ...
Дополнительная информация: https://babeljs.io/docs/en/babel-plugin-transform-object-rest-spread/
источник
Чтобы продвинуться в этом еще дальше, вы можете создать вспомогательную функцию, аналогичную именам классов:
А затем используйте его условно в ваших компонентах:
источник
В общем, я смотрю на это неправильно. Из того, что я вижу, это не конкретный вопрос React, а скорее вопрос JavaScript о том, как объединить два объекта JavaScript вместе (без заусенцев с одноименными свойствами).
В этом ответе StackOverflow это объясняет это. Как динамически объединить свойства двух объектов JavaScript?
В jQuery я могу использовать метод расширения.
источник
Чтобы расширить сказанное @PythonIsGreat, я создаю глобальную функцию, которая сделает это за меня:
Это глубоко расширяет объекты в новый объект и учитывает переменное количество объектов в качестве параметров. Это позволяет вам сделать что-то вроде этого:
источник
Я построил модуль для этого, если вы хотите добавить стили на основе такого условия:
https://www.npmjs.com/package/react-native-multiple-styles
источник
Способы встроенного моделирования:
источник