Существует не так много "лучших практик". Те из нас, кто использует встроенные стили для компонентов React, все еще очень много экспериментируют.
Есть несколько подходов, которые сильно различаются: Реагируйте на диаграмму сравнения библиотек inline-style
Все или ничего?
То, что мы называем «стилем», на самом деле включает в себя довольно много концепций:
- Макет - как элемент / компонент выглядит по отношению к другим
- Внешний вид - характеристики элемента / компонента
- Поведение и состояние - как элемент / компонент выглядит в данном состоянии
Начните с государственных стилей
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
(подчеркивание / lodash), чтобы добавить поддержку нескольких состояний:
// 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"
}
},
}
функции получения
Добавление логики стиля к вашему шаблону может стать немного грязным (как видно выше). Мне нравится создавать функции получения для вычисления стилей:
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 в начале этого года: встроенные стили и когда лучше «просто использовать CSS» .
Я рад помочь, когда вы делаете новые открытия по пути :) Ударь меня -> @chantastic