Я знаю, что вы можете указывать стили в классах 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-файле вообще не указаны стили?
Или мне следует полностью избегать встроенных стилей?
Кажется странным и грязным делать немного того и другого - нужно проверить два места при настройке стиля.
css
reactjs
inline-styles
react-jsx
eye_mew
источник
источник
Ответы:
Существует не так много "лучших практик". Те из нас, кто использует встроенные стили для компонентов React, все еще очень много экспериментируют.
Есть несколько подходов, которые сильно различаются: Реагируйте на диаграмму сравнения библиотек inline-style
Все или ничего?
То, что мы называем «стилем», на самом деле включает в себя довольно много концепций:
Начните с государственных стилей
React уже управляет состоянием ваших компонентов, это делает стили состояния и поведения естественными для согласования с логикой вашего компонента.
Вместо того чтобы создавать компоненты для рендеринга с помощью условных классов состояний, рассмотрите возможность непосредственного добавления стилей состояний:
Обратите внимание, что мы используем класс для оформления внешнего вида, но больше не используем
.is-
префиксный класс для состояния и поведения .Мы можем использовать
Object.assign
(ES6) или_.extend
(подчеркивание / lodash), чтобы добавить поддержку нескольких состояний:Настройка и повторное использование
Теперь, когда мы используем
Object.assign
его, становится очень просто сделать наш компонент многократно используемым с разными стилями. Если мы хотим , чтобы переопределить стили по умолчанию, мы можем сделать это в колл-сайта с реквизитом, например , так:<TodoItem dueStyle={ fontWeight: "bold" } />
. Реализовано так:раскладка
Лично я не вижу веской причины для встроенных стилей макета. Существует множество отличных систем макетов CSS. Я бы просто использовал один.
Тем не менее, не добавляйте стили макета непосредственно в ваш компонент. Оберните ваши компоненты компонентами макета. Вот пример.
Для поддержки макета я часто пытаюсь спроектировать компоненты, чтобы быть
100%
width
иheight
.Внешность
Это самая спорная область дебатов "в стиле". В конечном счете, все зависит от вашего дизайна и комфорта вашей команды с JavaScript.
Одно можно сказать наверняка, вам понадобится помощь библиотеки. Состояние браузера (
:hover
,:focus
) и медиа-запросы болезненны в сыром React.Мне нравится Radium, потому что синтаксис этих жестких частей разработан для моделирования синтаксиса SASS.
Код организации
Часто вы видите объект стиля вне модуля. Для компонента списка задач он может выглядеть примерно так:
функции получения
Добавление логики стиля к вашему шаблону может стать немного грязным (как видно выше). Мне нравится создавать функции получения для вычисления стилей:
Дальнейшее наблюдение
Я обсуждал все это более подробно в React Europe в начале этого года: встроенные стили и когда лучше «просто использовать CSS» .
Я рад помочь, когда вы делаете новые открытия по пути :) Ударь меня -> @chantastic
источник
div
,span
,a
и т.д. , это поможет стилю держать изолированный независимо от библиотеки вы используете. КомпонентыАтрибут style в React ожидает, что значение будет объектом, то есть парой ключ-значение.
style = {}
будет иметь другой объект внутри него, как{float:'right'}
заставить его работать.Надеюсь, что это решает проблему
источник
style
опоре, которая может привести к проблемам с производительностью. По крайней мере, определите такой постоянный стиль вне вашегоrender
. Надеюсь это поможет!Я широко использую встроенные стили в своих компонентах React. Я считаю, что гораздо удобнее объединять стили внутри компонентов, потому что всегда ясно, какие стили у компонента есть, а какие нет. Кроме того, наличие полной мощи Javascript действительно упрощает более сложные стилистические задачи.
Сначала я не был убежден, но после нескольких месяцев в этом я полностью преобразован и в процессе преобразования всего моего CSS в inline или другие методы css, управляемые JS.
Эта презентация сотрудника Facebook и участника React "vjeux" также очень полезна - https://speakerdeck.com/vjeux/react-css-in-js
источник
CSS Modules
,styled-components
и других.Основное назначение атрибута style - для динамических стилей, основанных на состоянии. Например, у вас может быть стиль ширины на индикаторе выполнения, основанный на каком-либо состоянии, или позиция или видимость, основанные на чем-то другом.
Стили в JS накладывают ограничение на то, что приложение не может предоставить пользовательские стили для повторно используемого компонента. Это вполне приемлемо в вышеупомянутых ситуациях, но не при изменении видимых характеристик, особенно цвета.
источник
<div><a>foo <b>bar</b></a><table>...</table></div>
как вы его оформляете из реквизита? Имейте в виду, что структура html должна оставаться деталью реализации, иначе вы потеряете много преимуществ, предоставляемых компонентами.Джеймс Нельсон в своем письме «Почему вы не должны разрабатывать компоненты React с помощью JavaScript» утверждает, что на самом деле нет необходимости использовать встроенные стили с его недостатками. Он утверждает, что старое скучное css с less / scss - лучшее решение. Часть его диссертаций в пользу css:
источник
Стилизация в JSX очень похожа на стилизацию в HTML.
HTML-кейс:
Дело JSX:
источник
Что я делаю, так это присваиваю каждому из моих повторно используемых компонентов уникальное имя пользовательского элемента, а затем создаю файл CSS для этого компонента, в частности, со всеми параметрами стилей для этого компонента (и только для этого компонента).
И в файле 'custom-component.css' каждая запись будет начинаться с тега custom-component:
Это означает, что вы не теряете критического понятия разделения заботы. Посмотреть против стиля. Если вы поделитесь своим компонентом, другим будет проще настроить его так, чтобы он соответствовал остальной части их веб-страницы.
источник
Это действительно зависит от того, насколько велико ваше приложение, если вы хотите использовать такие упаковщики, как webpack пакет и объединять CSS и JS вместе в сборке, и то, как вы хотите управлять потоком приложений! В конце дня, в зависимости от вашей ситуации, вы можете принять решение!
Я предпочитаю организовывать файлы в больших проектах, разделяя CSS и JS файлы , проще делиться, людям с интерфейсом проще просто просматривать CSS-файлы, а также гораздо более аккуратную организацию файлов для всего приложения!
Всегда думайте так, убедитесь, что на этапе разработки все находится там, где они должны быть, правильно названы и другим разработчикам будет легко найти вещи ...
Я лично смешиваю их, в зависимости от моих потребностей, например ... Попробуйте использовать внешний CSS, но если необходимо, React также примет стиль, вам нужно передать его как объект со значением ключа, что-то вроде этого ниже:
источник
Вот логическое моделирование в синтаксисе JSX :
источник
У меня обычно есть файл scss, связанный с каждым компонентом React. Но я не вижу причины, по которой вы бы не инкапсулировали компонент с помощью логики и не заглядывали в него. Я имею в виду, у вас похожая вещь с веб-компонентами.
источник
В зависимости от вашей конфигурации встроенный стиль может предложить вам горячую перезагрузку. Веб-страница немедленно перерисовывается каждый раз, когда меняется стиль. Это помогает мне быстрее разрабатывать компоненты. Сказав это, я уверен, что вы можете настроить среду горячей перезагрузки для CSS + SCSS.
источник
Вы можете использовать встроенные стили, но у вас будут некоторые ограничения, если вы будете использовать их во всех своих стилях, некоторые известные ограничения - вы не можете использовать псевдо-селекторы CSS и медиа-запросы .
Вы можете использовать Радий чтобы решить эту проблему, но, тем не менее, я чувствую, что проект будет расти и станет громоздким.
Я бы порекомендовал использовать модули CSS .
С помощью CSS-модулей у вас будет свобода писать CSS в CSS-файле, и вам не придется беспокоиться о конфликтах имен, об этом позаботятся CSS-модули.
Преимущество этого метода в том, что он предоставляет вам функциональность стилей для конкретного компонента. Это создаст гораздо более понятный код и читаемую архитектуру проекта для следующего разработчика, который будет работать над вашим проектом.
источник
Для некоторых компонентов проще использовать встроенные стили. Кроме того, мне проще и лаконичнее (поскольку я использую Javascript, а не CSS) анимировать стили компонентов.
Для автономных компонентов я использую «Оператор распространения» или «...». Для меня это понятно, красиво и работает в стесненных условиях. Вот небольшая анимация загрузки, которую я сделал, чтобы показать ее преимущества:
РЕДАКТИРОВАТЬ НОЯБРЬ 2019
Работая в отрасли (компания из списка Fortune 500), мне НЕ разрешается делать какие-либо встроенные стили. В нашей команде мы решили, что встроенный стиль не читается и не поддерживается. И, увидев из первых рук, как встроенные стили делают поддержку приложения совершенно невыносимой, я должен был согласиться. Я полностью не одобряю встроенные стили.
источник
Проблема встроенных стилей заключается в том, что политики безопасности контента (CSP) становятся все более распространенными, что не позволяет этого. Поэтому я рекомендую полностью избегать встроенных стилей.
Обновление. Чтобы пояснить подробнее, 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/
источник
unsafe-inline
политику. Эта политика позволяет ограничение элемента стиля<style>
не встроенных стилей , примененных к атрибуту стиля элемента:<div style="">
. Поскольку вопрос выше относится к атрибуту style, это плохой совет, чтобы полностью избегать встроенных стилей. Кроме того ,react
советует , чтобы переместить все CSS в JS: github.com/reactjs/react-future/blob/master/04%20-%20Layout/...unsafe-inline
отключает все формы встроенных стилей, включая атрибут style. Вы можете программно использовать API стилей для элемента через JS (напримерelem.style.color = 'blue';
), но вы не можете установить атрибут стиля для элемента (так же, как'unsafe-inline'
в директиве script-src запрещены встроенные теги сценария, но такжеonclick
атрибуты и друзья.)По сравнению с записью ваших стилей в CSS-файле атрибут стиля React имеет следующие преимущества :
Однако атрибут стиля React имеет несколько недостатков - вы не можете
Используя CSS в JS, вы можете получить все преимущества тега стиля без этих недостатков. . На сегодняшний день существует несколько популярных хорошо поддерживаемых css в js-библиотеках, в том числе: Emotion, Styled-Components и Radium. Эти библиотеки предназначены для CSS, как React для HTML. Они позволяют вам писать свой CSS и контролировать свой CSS в своем коде JS.
давайте сравним, как будет выглядеть наш код для стилизации простого элемента. Мы создадим div "hello world", чтобы он показывался большим на рабочем столе и меньше на мобильном.
Использование атрибута стиля
Так как медиа-запрос невозможен в теге стиля, нам нужно добавить className к элементу и добавить правило css.
Использование тега Emotion 10 css
Emotion также поддерживает строки шаблонов и стилизованные компоненты. Поэтому, если вы предпочитаете, вы можете написать:
За капюшонами "Css in JS" используются классы css. Эмоция была специально разработана с учетом производительности и использует кеширование. По сравнению с атрибутами стиля React Css в JS обеспечит лучшую производительность.
Лучшие практики
Вот несколько рекомендаций, которые я рекомендую:
Шаблон кодирования React состоит из инкапсулированных компонентов - HTML и JS, управляющий компонентом, записаны в одном файле. Вот где находится ваш код CSS / style для стилизации этого компонента.
При необходимости добавьте в свой компонент стайлинг. Таким образом, вы можете повторно использовать код и стиль, написанный в дочернем компоненте, и настраивать его в соответствии с вашими конкретными потребностями родительским компонентом.
источник
Вы также можете использовать StrCSS, он создает изолированные имена классов и многое другое! Пример кода будет выглядеть так: Вы можете (необязательно) установить расширение VSCode из Visual Studio Marketplace для поддержки подсветки синтаксиса!
источник: strcss
источник
Некоторое время нам требуется стилизовать какой-то элемент из компонента, но если нам нужно отобразить только этот компонент или его стиль меньше, чем вместо использования класса CSS, мы используем встроенный стиль в реагировать на js. Встроенный стиль responsejs такой же, как встроенный стиль HTML, только имена свойств немного отличаются
Напишите свой стиль в любом теге, используя style = {{prop: "value"}}
источник
Обновление 2020: Лучшая практика - использовать библиотеку, которая уже выполнила тяжелую работу за вас и не убивает вашу команду, когда вы делаете переход, как указано первоначально принятым ответом в этом видео (это все еще актуально). Также, чтобы понять тенденции, это очень полезный график . Проведя собственное исследование по этому вопросу, я решил использовать Emotion для своих новых проектов, и он оказался очень гибким и масштабируемым.
Учитывая, что наиболее одобренный ответ от 2015 года рекомендовал Radium, который теперь переведен в режим обслуживания . Поэтому представляется разумным добавить список альтернатив. После прекращения Radium предлагает несколько библиотек. У каждого из сайтов, на которые есть ссылки, есть примеры, которые легко доступны, поэтому я воздержусь от копирования и вставки кода здесь.
источник
В любом случае встроенный CSS никогда не рекомендуется. Мы использовали styled-компоненты в нашем проекте, который основан на JSS. Он защищает переопределение CSS, добавляя динамические имена классов в компоненты. Вы также можете добавить значения CSS на основе пропущенных реквизитов.
источник