Лучшие практики React.js во встроенном стиле

342

Я знаю, что вы можете указать стили в классах React, например:

var MyDiv = React.createClass({
  render: function() {
    var style = {
      color: 'white',
      fontSize: 200
    };

    return <div style={style}> Have a good and productive day! </div>;
  }
});

Должен ли я стремиться делать все стили таким образом и не иметь стилей вообще, указанных в моем файле CSS?

Или я должен полностью избегать встроенных стилей?

Кажется странным и беспорядочным, чтобы немного поработать - два места нужно было бы проверить при настройке стиля.

  • 0
    Вы можете использовать реагирующую тему, чтобы упорядочить встроенные стили и сделать их легко настраиваемыми при создании повторно используемого компонента. Он работает аналогично ThemeManager в Material-UI .
  • 3
    Попробуйте использовать github.com/css-modules/css-modules . github.com/gajus/react-css-modules является реализацией React (автором которой я являюсь). Модули CSS и модули React CSS автоматически сопоставляют имена классов компонентов с модулями CSS, которым присваивается уникальное имя в области видимости документа.
Показать ещё 1 комментарий
Теги:
inline-styles
react-jsx

11 ответов

342
Лучший ответ

Пока еще не так много "лучших практик". Те из нас, кто использует встроенные стили для компонентов React, все еще очень экспериментируют.

Существует множество подходов, которые сильно различаются: Изменить сравнительную таблицу lib в линейном стиле

Все или ничего?

То, что мы называем "стилем", на самом деле включает в себя довольно много понятий:

  • Макет - как элемент/компонент выглядит по отношению к другим
  • Внешний вид - характеристики элемента/компонента
  • Поведение и состояние - как элемент/компонент выглядит в заданном состоянии

Начните с стилей состояния

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 (underscore/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.

Внешний вид

Это самая спорная область в дискуссиях "inline-style". В конечном счете, это зависит от компонента вашего проектирования и комфорта вашей команды с JavaScript.

Одно можно сказать наверняка, вам понадобится помощь библиотеки. Браузерные состояния (:hover, :focus) и медиа-запросы болезненны в сырой реакции.

Мне нравится Radium, потому что синтаксис этих жестких частей предназначен для моделирования модели SASS.

Организация кода

Часто вы увидите объект стиля вне модуля. Для компонента списка дел он может выглядеть примерно так:

var styles = {
  root: {
    display: "block"
  },
  item: {
    color: "black"

    complete: {
      textDecoration: "line-through"
    },

    due: {
      color: "red"
    }
  },
}

функции getter

Добавление кусочка логики стиля в ваш шаблон может стать немного грязным (как видно выше). Мне нравится создавать функции 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 в начале этого года: Встроенные стили и когда лучше всего использовать CSS только.

Я рад помочь, когда вы делаете новые открытия на этом пути.:) Поразите меня → @chantastic

  • 8
    Отличное чтение. Также очень ценю эту важную речь , @chantastic. #принято
  • 5
    «Оберните ваши компоненты компонентами макета»: так очевидно, но именно то, что мне было нужно.
Показать ещё 15 комментариев
43

Атрибут style в React ожидает, что это значение будет представлять собой объект, т.е. пару значений ключа.

style = {} будет иметь в нем другой объект, например {float: 'right'}, чтобы он работал.

<span style={{float:'right'}}>{'Download Audit'}</span>

Надеюсь, что это решает проблему

  • 1
    так, как использовать медиа-запрос для того же, если я хочу использовать классы CSS в файле JS
  • 0
    @PardeepJain Один из способов - использовать Emotion здесь - полная лекция об этом, если вы заинтересованы в саммите meet.js 2018
42

Я использую встроенные стили в моих компонентах React. Я нахожу гораздо более ясным, чтобы группировать стили внутри компонентов, потому что всегда ясно, какие стили он делает и чего нет. Плюс, имея полную мощность Javascript под рукой, действительно упрощает более сложные требования к стилю.

Сначала я не был убежден, но после долгих месяцев работы над ним я полностью конвертировался и в процессе преобразования всех моих CSS в встроенные или другие JS-методы css.

Эта презентация сотрудника Facebook и вкладчика React Contributor "vjeux" также очень полезна - https://speakerdeck.com/vjeux/react-css-in-js

  • 4
    Как я буду делать адаптивные макеты со встроенными стилями? У вас нет возможности для медиа-запросов здесь.
  • 0
    Вы получаете мощь js, js может определять размеры браузера для динамического создания стилей.
Показать ещё 3 комментария
15

Основная цель атрибута style - динамические, основанные на состоянии стили. Например, вы можете иметь стиль ширины на индикаторе выполнения на основе некоторого состояния или позиции или видимости на основе чего-то еще.

Стили в JS налагают ограничение, которое приложение не может предоставить настраиваемому стилю для повторно используемого компонента. Это вполне приемлемо в вышеупомянутых ситуациях, но не при изменении видимых характеристик, особенно в цвете.

  • 0
    Связанная идея, которая у нас была в течение некоторого времени, заключается в возможности изолировать определенные правила CSS для компонента React, используя gulp и LESS. Вроде как установка определенного className для каждого компонента, затем добавление определенного CSS для этого класса в файле компонента. Это имело бы много смысла.
  • 0
    Я часто использую имена классов в формате "component- {app} - {componentName}". «{приложение}» может быть именем приложения или «общим» для независимых от приложения компонентов. например, "component-foo-todo-list" для TodoList и "component-common-light-switch-toggle". Для упакованных компонентов {app} будет именем npm. Это то, что вы имеете в виду?
Показать ещё 4 комментария
10

Джеймс К. Нельсон в своем письме "Почему вы не должны реагировать на компоненты с помощью JavaScript" утверждает, что на самом деле нет необходимости использовать встроенные стили со своими минусами. Его утверждение состоит в том, что старое скучное css с меньшим /scss - лучшее решение. Часть его тезисов в пользу css:

  • расширяемый внешний вид
  • с возможностью использования (встроенные стили перекрывают все)
  • дизайнер дружественный
3

Вы можете использовать react-theme, чтобы организовать свои встроенные стили и сделать их легко настраиваемыми, когда вы создаете повторно используемый компонент.

Он работает аналогично ThemeManager в материале-ui.

3

Что я делаю - это предоставить каждому из моих многократно используемых компонентов уникальное имя пользовательского элемента, а затем создать файл css для этого компонента, в частности, со всеми параметрами стиля для этого компонента (и только для этого компонента).

var MyDiv = React.createClass({
  render: function() {
    return <custom-component style={style}> Have a good and productive day! </custom-component>;
  }
});

И в файле "custom-component.css" каждая запись начнется с тега пользовательского компонента:

custom-component { 
   display: block; /* have it work as a div */
   color: 'white'; 
   fontSize: 200; 
} 
custom-component h1 { 
  font-size: 1.4em; 
}

Это означает, что вы не теряете критического понятия разделения беспокойства. Просмотр и стиль. Если вы делитесь своим компонентом, другим пользователям легче сопоставить их с остальной частью своей веб-страницы.

  • 0
    Вот как я это делаю. Единственным недостатком является то, что это два файла вместо одного. Я могу жить с этим.
1

В зависимости от вашей конфигурации встроенный стиль может предложить вам горячую перезагрузку. Веб-страница сразу же отображается повторно при каждом изменении стиля. Это помогает мне быстрее разрабатывать компоненты. Сказав это, я уверен, что вы можете настроить горячую перезагрузку для CSS + SCSS.

1

Обычно у меня есть файл scss, связанный с каждым компонентом React. Но я не вижу причин, почему вы не инкапсулируете компонент логикой и не смотрите в нее. Я имею в виду, что у вас есть аналогичная вещь с веб-компонентами.

0

Это действительно зависит от того, как большое ваше приложение, если вы хотите использовать связки, такие как webpack, и объединить CSS и JS вместе в сборке и как вы хотите управлять потоком приложений! В конце дня, зависит от вашей ситуации, вы можете принять решение!

Мое предпочтение для организации файлов в больших проектах заключается в разделении файлов CSS и JS, это может быть проще для обмена, проще для пользователей пользовательского интерфейса просто просматривать файлы CSS, а также гораздо более аккуратный файл для организации всего приложения!

Всегда думайте так, убедитесь, что на стадии разработки все, где они должны быть, правильно названы и быть легкими для других разработчиков, чтобы найти вещи...

-3

Проблема со встроенными стилями - это политики безопасности контента (CSP), которые становятся все более распространенными, что не позволяет. Поэтому я рекомендую полностью исключить встроенные стили.

Update: Чтобы объяснить далее, CSP представляют собой HTTP-заголовки, отправленные сервером, которые ограничивают, какой контент может отображаться на странице. Это просто дальнейшее смягчение, которое может быть применено к серверу, чтобы остановить злоумышленника от совершения чего-либо непослушного, если разработчик плохо кодирует сайт.

Цель большинства этих ограничений - остановить атаки XSS (межсайтовый скриптинг). XSS - это то, где злоумышленник определяет способ включить свой собственный javascript на вашу страницу (например, если я сделаю свое имя пользователя bob<SCRIPT>alert("hello")</SCRIPT>, а затем опубликую комментарий, и вы заходите на страницу, он не должен показывать предупреждение). Разработчики должны отрицать возможность добавления пользователем такого контента на сайт, но на случай, если они допустили ошибку, CSP блокирует загрузку страницы, если она найдет теги script>.

CSP - это всего лишь дополнительный уровень защиты для разработчиков, чтобы убедиться, что они допустили ошибку, что злоумышленник не может создавать проблемы для посетителей этого сайта.

Итак, все это XSS, но что, если злоумышленник не может включать теги <script>, но может включать теги <style> или включать параметр style= в тег? Затем он сможет изменить внешний вид сайта таким образом, чтобы вы обманом нажали на неправильную кнопку или какую-то другую проблему. Это гораздо меньше беспокоит, но все равно что-то избежать, и CSP делает это для вас.

Хорошим ресурсом для тестирования сайта для CSP является https://securityheaders.io/

Вы можете узнать больше о CSP: http://www.html5rocks.com/en/tutorials/security/content-security-policy/

  • 0
    Можете ли вы объяснить немного больше?
  • 7
    Вы обращаетесь конкретно к unsafe-inline политике. Эта политика разрешает ограничение элемента стиля <style> чтобы не использовать встроенные стили, применяемые к атрибуту style элемента: <div style=""> . Поскольку вопрос выше относится к атрибуту style, это плохой совет, чтобы полностью избегать встроенных стилей. Кроме того, react на перенос всех CSS в JS: github.com/reactjs/react-future/blob/master/04%20-%20Layout/…
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню