J'aime assez le modèle CSS en ligne dans React et j'ai décidé de l'utiliser.
Cependant, vous ne pouvez pas utiliser les :hover
sélecteurs et similaires. Alors, quelle est la meilleure façon d'implémenter la mise en évidence au survol tout en utilisant des styles CSS en ligne?
Une suggestion de #reactjs est d'avoir un Clickable
composant et de l'utiliser comme ceci:
<Clickable>
<Link />
</Clickable>
Le Clickable
a un hovered
état et le transmet comme accessoires au lien. Cependant, Clickable
(la façon dont je l'ai implémenté) enveloppe le Link
dans un div
afin qu'il puisse définir onMouseEnter
et onMouseLeave
y accéder. Cela rend les choses un peu compliquées (par exemple, span
enveloppé dans un div
se comporte différemment span
).
Existe-t-il un moyen plus simple?
onMouseEnter
etonMouseLeave
. En ce qui concerne la mise en œuvre exacte de cela, cela dépend entièrement de vous. Pour regarder votre exemple spécifique, pourquoi ne pas faire de l'<Clickable/>
emballage unspan
?Réponses:
Je suis dans la même situation. Vraiment comme le modèle de maintien du style dans les composants, mais les états de survol semblent être le dernier obstacle.
Ce que j'ai fait, c'est d'écrire un mixin que vous pouvez ajouter à votre composant qui nécessite des états de survol. Ce mixin ajoutera une nouvelle
hovered
propriété à l'état de votre composant. Il sera défini surtrue
si l'utilisateur survole le nœud DOM principal du composant et le réinitialisefalse
si les utilisateurs quittent l'élément.Maintenant, dans votre fonction de rendu de composant, vous pouvez faire quelque chose comme:
Désormais, chaque fois que l'état de l'
hovered
état change, le composant sera renvoyé.J'ai également créé un dépôt sandbox pour cela que j'utilise pour tester moi-même certains de ces modèles. Vérifiez-le si vous voulez voir un exemple de ma mise en œuvre.
https://github.com/Sitebase/cssinjs/tree/feature-interaction-mixin
la source
Je pense que onMouseEnter et onMouseLeave sont les voies à suivre, mais je ne vois pas la nécessité d'un composant wrapper supplémentaire. Voici comment je l'ai implémenté:
Vous pouvez ensuite utiliser l'état de survol (vrai / faux) pour changer le style du lien.
la source
:hover
mais pas:focus
onFocus
événement; donc vous pourriez faire la même chose pour:focus
comme:hover
, sauf au lieu d'avoir besoinonMouseEnter
etonMouseLeave
vous n'en auriez besoin queonFocus
En retard pour faire la fête mais avec une solution. Vous pouvez utiliser "&" pour définir les styles de survol du nième enfant, etc.:
la source
Vous pouvez utiliser Radium - c'est un outil open source pour les styles en ligne avec ReactJS. Il ajoute exactement les sélecteurs dont vous avez besoin. Très populaire, vérifiez-le - Radium sur npm
la source
module.exports = React.createClass({ displayName: 'App',})
module.exports = Radium(React.createClass({ displayName: 'App',}))
ou attribuer la classe à une valeur et ajouter le@Radium
décorateur au-dessus comme la documentation mentionne github.com/FormidableLabs/radium#usageLe support CSS complet est exactement la raison pour laquelle cette énorme quantité de bibliothèques CSSinJS, pour le faire efficacement, vous devez générer du CSS réel, pas des styles en ligne. Les styles en ligne sont également beaucoup plus lents à réagir dans un système plus grand. Clause de non-responsabilité - Je maintiens JSS .
la source
Made Style It - en partie - à cause de cette raison (d'autres étant des désaccords avec l'implémentation d'autres libs / syntaxes et les styles en ligne manquent de support pour le préfixage des valeurs de propriété). Croyez que nous devrions être capables d'écrire simplement du CSS en JavaScript et d'avoir des composants entièrement autonomes HTML-CSS-JS. Avec les chaînes de modèles ES5 / ES6, nous pouvons maintenant et cela peut être joli aussi! :)
npm install style-it --save
Syntaxe fonctionnelle ( JSFIDDLE )
Syntaxe JSX ( JSFIDDLE )
la source
En plus de la réponse de Jonathan , voici les événements pour couvrir le focus et les états actifs, et une utilisation
onMouseOver
au lieu deonMouseEnter
puisque ce dernier ne bouillonnera pas si vous avez des éléments enfants dans la cible à laquelle l'événement est appliqué.la source
Voici ma solution en utilisant React Hooks. Il combine l'opérateur d'étalement et l'opérateur ternaire.
style.js
Button.js
la source
En ce qui concerne les composants stylisés et react-router v4, vous pouvez le faire:
la source
Cela peut être un bon hack pour avoir un style en ligne dans un composant de réaction (et également en utilisant la fonction CSS hover):
la source
Commander Styles de police si vous utilisez React avec Typescript.
Voici un exemple de code pour: hover
la source
Vous pouvez utiliser des modules css comme alternative, et en plus react-css-modules pour le mappage des noms de classe.
De cette façon, vous pouvez importer vos styles comme suit et utiliser le CSS normal étendu localement à vos composants:
Voici un exemple de modules css webpack
la source
:hover
styles au moment de l'exécution comme vous pouvez le faire avec Radium ou une autreonMouseOver
solution baséeonMouseOver et onMouseLeave avec setState m'ont d'abord semblé un peu trop compliqué - mais comme c'est ainsi que fonctionne React, cela me semble la solution la plus simple et la plus propre.
le rendu d'un côté serveur css de thème par exemple, est également une bonne solution et maintient les composants de réaction plus propres.
si vous n'avez pas à ajouter de styles dynamiques aux éléments (par exemple pour une thématisation), vous ne devez pas du tout utiliser de styles en ligne mais utilisez plutôt des classes css.
c'est une règle traditionnelle html / css pour garder html / JSX propre et simple.
la source
Le moyen simple consiste à utiliser l'opérateur ternaire
la source
Avec une utilisation des crochets:
la source
J'utilise une solution assez hack-ish pour cela dans l'une de mes applications récentes qui fonctionne pour mes besoins, et je trouve cela plus rapide que d'écrire des fonctions de paramètres de survol personnalisés dans vanilla js (bien que, je reconnais, peut-être pas une meilleure pratique dans la plupart des environnements ..) Donc, au cas où vous seriez toujours intéressé, allez-y.
Je crée un élément parent juste pour le plaisir de contenir les styles javascript en ligne, puis un enfant avec un nom de classe ou un identifiant sur lequel ma feuille de style css s'accrochera et écrira le style de survol dans mon fichier css dédié. Cela fonctionne car l'élément enfant le plus granulaire reçoit les styles js en ligne via l'héritage, mais ses styles de survol sont remplacés par le fichier css.
Donc, fondamentalement, mon fichier css existe dans le seul but de contenir des effets de survol, rien d'autre. Cela le rend assez concis et facile à gérer, et me permet de faire le gros du travail dans mes styles de composants React en ligne.
Voici un exemple:
Notez que le style en ligne "enfant" n'a pas de jeu de propriétés "couleur". Si c'était le cas, cela ne fonctionnerait pas car le style en ligne prévaudrait sur ma feuille de style.
la source
Je ne suis pas sûr à 100% si c'est la réponse, mais c'est l'astuce que j'utilise pour simuler le CSS: effet de survol avec des couleurs et des images en ligne.
CSS:
Exemple: https://codepen.io/roryfn/pen/dxyYqj?editors=0011
la source
Où Hoverable est défini comme:
la source