Мне очень нравится встроенный шаблон CSS в React, и я решил использовать его.
Тем не менее, вы не можете использовать :hover
и подобные селекторы. Итак, как лучше всего реализовать выделение при наведении при использовании встроенных стилей CSS?
Одно из предложений от #reactjs - иметь Clickable
компонент и использовать его следующим образом:
<Clickable>
<Link />
</Clickable>
Clickable
Имеет hovered
состояние и передает его в качестве реквизита на ссылку. Тем не менее, Clickable
(способ, которым я это реализовал) оборачивает Link
в div
так, чтобы он мог установить onMouseEnter
и onMouseLeave
к нему. Это делает вещи немного сложнее, хотя (например, span
завернутый в a div
ведет себя иначе, чем span
).
Есть ли более простой способ?
onMouseEnter
иonMouseLeave
. Относительно точной реализации этого - это полностью зависит от вас. Чтобы посмотреть на ваш конкретный пример, почему бы не сделать<Clickable/>
оберткуspan
?Ответы:
Я в такой же ситуации. Очень похоже на шаблон сохранения стиля в компонентах, но состояние наведения кажется последним препятствием.
Я написал миксины, которые вы можете добавить к своему компоненту, для которого нужны состояния наведения. Этот миксин добавит новое
hovered
свойство в состояние вашего компонента. Будет установлено,true
если пользователь наводит курсор на основной узел DOM компонента и устанавливает его обратно вfalse
если пользователь покидает элемент.Теперь в вашей функции рендеринга компонента вы можете сделать что-то вроде:
Теперь каждый раз, когда состояние
hovered
состояния изменяется, компонент будет перерисовываться.Я также создал для этого репозиторий с песочницей, который сам использую для тестирования некоторых из этих паттернов. Проверьте это, если хотите увидеть пример моей реализации.
https://github.com/Sitebase/cssinjs/tree/feature-interaction-mixin
источник
Я думаю, что onMouseEnter и onMouseLeave - это то, что нужно, но я не вижу необходимости в дополнительном компоненте-обертке. Вот как я это реализовал:
Затем вы можете использовать состояние наведения (true / false), чтобы изменить стиль ссылки.
источник
:hover
но не:focus
onFocus
событие; так что вы могли бы сделать то же самое для ,:focus
как:hover
, за исключением того, вместо того ,onMouseEnter
иonMouseLeave
вам нужно будет толькоonFocus
Опоздал на вечеринку, но пришел с решением. Вы можете использовать "&", чтобы определить стили для hover nth Child и т.д .:
источник
Вы можете использовать Radium - это инструмент с открытым исходным кодом для встроенных стилей с ReactJS. Он добавляет именно те селекторы, которые вам нужны. Очень популярно, зацените - Radium на npm
источник
module.exports = React.createClass({ displayName: 'App',})
module.exports = Radium(React.createClass({ displayName: 'App',}))
либо присвоить классу значение, и добавить@Radium
декоратор над ним, если упомянуть документы github.com/FormidableLabs/radium#usageПолная поддержка CSS - это как раз та причина, по которой огромное количество библиотек CSSinJS делает это эффективно, вам нужно генерировать настоящий CSS, а не встроенные стили. Кроме того, встроенные стили намного медленнее реагируют в большей системе. Отказ от ответственности - я поддерживаю JSS .
источник
Made Style It - отчасти - по этой причине (из-за несогласия с реализацией других библиотек / синтаксиса и встроенных стилей отсутствует поддержка префикса значений свойств). Поверьте, мы должны иметь возможность просто писать CSS на JavaScript и иметь полностью автономные компоненты HTML-CSS-JS. С шаблонными строками ES5 / ES6 мы теперь можем, и это может быть довольно красиво! :)
npm install style-it --save
Функциональный синтаксис ( JSFIDDLE )
Синтаксис JSX ( JSFIDDLE )
источник
В дополнение к ответу Джонатана , вот события, которые охватывают фокус и активные состояния, и использование
onMouseOver
вместо,onMouseEnter
так как последнее не будет пузыриться, если у вас есть какие-либо дочерние элементы в цели, к которой применяется событие.источник
Вот мое решение с использованием React Hooks. Он сочетает в себе оператор распространения и троичный оператор.
style.js
Button.js
источник
Что касается styled-components и response-router v4, вы можете сделать это:
источник
Это может быть хорошим подспорьем для использования встроенного стиля внутри реагирующего компонента (а также с помощью: hover CSS-функции):
источник
Оформить заказ Typestyle, если вы используете React с Typescript.
Ниже приведен пример кода для: hover
источник
Вы можете использовать модули css в качестве альтернативы и дополнительно реагировать на css-модули. для отображения имен классов.
Таким образом, вы можете импортировать ваши стили следующим образом и использовать обычную CSS-область локально для ваших компонентов:
Вот пример модуля CSS c webpack
источник
:hover
стили во время выполнения, как вы можете с помощью Radium или другогоonMouseOver
решения на основеonMouseOver и onMouseLeave с setState поначалу показались мне немного непосильными, но поскольку именно так работает реагирование, мне кажется, это самое простое и чистое решение.
рендеринг тематических css серверов, например, также является хорошим решением и обеспечивает более чистую реакцию компонентов.
если вам не нужно добавлять динамические стили к элементам (например, для создания тем), вам вообще не следует использовать встроенные стили, а вместо этого использовать классы CSS.
Это традиционное правило html / css, позволяющее сохранять html / JSX чистым и простым.
источник
Простой способ - использование троичного оператора
источник
С использованием крючков:
источник
Я использую для этой цели довольно однозначное решение в одном из моих недавних приложений, которое работает для моих целей, и я нахожу это быстрее, чем написание пользовательских функций настройки наведения в vanilla js (хотя, я признаю, может быть, не самая лучшая практика в большинстве сред ..) Итак, если вы все еще заинтересованы, здесь идет.
Я создаю родительский элемент только для хранения встроенных стилей javascript, затем дочерний элемент с className или id, к которому привязывается моя таблица стилей css и записывает стиль наведения в моем выделенном файле css. Это работает, потому что более детальный дочерний элемент получает встроенные js-стили через наследование, но его стили при наведении мыши переопределяются файлом css.
В общем, мой настоящий css-файл существует с единственной целью - удерживать эффекты при наведении, и ничего более. Это делает его довольно лаконичным и простым в управлении, и позволяет мне выполнять тяжелую работу в моих встроенных стилях компонентов React.
Вот пример:
Обратите внимание, что встроенный стиль дочернего элемента не имеет установленного свойства color. Если это так, это не сработает, потому что встроенный стиль будет иметь приоритет над моей таблицей стилей.
источник
Я не уверен на 100%, если это ответ, но это трюк, который я использую, чтобы имитировать CSS: эффект наведения с помощью встроенных цветов и изображений.
CSS:
Пример: https://codepen.io/roryfn/pen/dxyYqj?editors=0011
источник
Где Hoverable определяется как:
источник