"Кращих практик" поки що не багато. Ті з нас, хто використовує вбудовані стилі для компонентів React, ще дуже експериментують.
Існує ряд підходів, які різко відрізняються: Реагуйте діаграму порівняння ліній в стилі inline
Все або нічого?
Те, що ми називаємо "стилем", насправді включає в себе досить багато понять:
- Макет - як елемент / компонент виглядає по відношенню до інших
- Зовнішній вигляд - характеристики елемента / компонента
- Поведінка та стан - як виглядає елемент / компонент у заданому стані
Почніть з державних стилів
React вже керує станом ваших компонентів, це робить стилі стану та поведінки природними придатними для колонізації з вашою логікою компонента.
Замість того, щоб створювати компоненти для візуалізації з умовними класами стану, розгляньте можливість додавання стилів стану безпосередньо:
// Typical component with state-classes
<li
className={classnames({ 'todo-list__item': true, 'is-complete': item.complete })} />
// Using inline-styles for state
<li className='todo-list__item'
style={(item.complete) ? styles.complete : {}} />
Зауважте, що ми використовуємо клас для стильового вигляду, але більше не використовуємо жодного .is-
префіксованого класу для стану та поведінки .
Ми можемо використовувати Object.assign
(ES6) або _.extend
(підкреслення / подача), щоб додати підтримку для кількох станів:
// Supporting multiple-states with inline-styles
<li 'todo-list__item'
style={Object.assign({}, item.complete && styles.complete, item.due && styles.due )}>
Настроювання та повторне використання
Тепер, коли ми використовуємо Object.assign
це стає дуже просто зробити наш компонент для багаторазового використання з різними стилями. Якщо ми хочемо , щоб перевизначити стилі за замовчуванням, ми можемо зробити це в колл-сайту з реквізитом, наприклад , так: <TodoItem dueStyle={ fontWeight: "bold" } />
. Реалізовано так:
<li 'todo-list__item'
style={Object.assign({},
item.due && styles.due,
item.due && this.props.dueStyles)}>
Макет
Особисто я не бачу переконливих причин вбудовувати стилі компонування. Існує ряд чудових систем компонування CSS. Я б просто скористався.
При цьому не додайте стилів компонування безпосередньо до свого компонента. Оберніть свої компоненти компонентами компонування. Ось приклад.
// This couples your component to the layout system
// It reduces the reusability of your component
<UserBadge
className="col-xs-12 col-sm-6 col-md-8"
firstName="Michael"
lastName="Chan" />
// This is much easier to maintain and change
<div class="col-xs-12 col-sm-6 col-md-8">
<UserBadge
firstName="Michael"
lastName="Chan" />
</div>
Для підтримки верстки я часто намагаюся створити компоненти, які будуть 100%
width
і height
.
Зовнішній вигляд
Це найбільш суперечлива область дебатів "в стилі інлайнеру". Зрештою, це залежить від компонента вашого дизайну та комфорту вашої команди з JavaScript.
Одне певне, вам знадобиться допомога бібліотеки. Стани браузера ( :hover
, :focus
) та медіа-запити є болісними в необробленій React.
Мені подобається Radium, тому що синтаксис для цих твердих частин призначений для моделювання SASS.
Організація коду
Часто ви бачите об’єкт стилю поза модулем. Для компонента списку тодо може виглядати приблизно так:
var styles = {
root: {
display: "block"
},
item: {
color: "black"
complete: {
textDecoration: "line-through"
},
due: {
color: "red"
}
},
}
функції геттера
Додавання до логічного шаблону стику логіки може стати трохи безладним (як це було показано вище). Мені подобається створювати функції Getter для обчислення стилів:
React.createClass({
getStyles: function () {
return Object.assign(
{},
item.props.complete && styles.complete,
item.props.due && styles.due,
item.props.due && this.props.dueStyles
);
},
render: function () {
return <li style={this.getStyles()}>{this.props.item}</li>
}
});
Подальше перегляд
Я обговорював все це більш докладно в React Europe на початку цього року: Inline Styles та коли найкраще "просто використовувати CSS" .
Я радий допомогти, коли ви робите нові відкриття по дорозі :) Відіжміть мене -> @chantastic