Comment pouvez-vous obtenir un événement de survol ou un événement actif dans ReactJS lorsque vous effectuez un style en ligne?
J'ai trouvé que l'approche onMouseEnter, onMouseLeave est boguée, j'espère donc qu'il existe une autre façon de le faire.
Plus précisément, si vous passez la souris sur un composant très rapidement, seul l'événement onMouseEnter est enregistré. OnMouseLeave ne se déclenche jamais, et ne peut donc pas mettre à jour l'état ... laissant le composant apparaître comme s'il était toujours survolé. J'ai remarqué la même chose si vous essayez d'imiter la pseudo-classe css ": active". Si vous cliquez très rapidement, seul l'événement onMouseDown s'enregistrera. L'événement onMouseUp sera ignoré ... laissant le composant apparaître actif.
Voici un JSFiddle montrant le problème: https://jsfiddle.net/y9swecyu/5/
Vidéo de JSFiddle avec problème: https://vid.me/ZJEO
Le code:
var Hover = React.createClass({
getInitialState: function() {
return {
hover: false
};
},
onMouseEnterHandler: function() {
this.setState({
hover: true
});
console.log('enter');
},
onMouseLeaveHandler: function() {
this.setState({
hover: false
});
console.log('leave');
},
render: function() {
var inner = normal;
if(this.state.hover) {
inner = hover;
}
return (
<div style={outer}>
<div style={inner}
onMouseEnter={this.onMouseEnterHandler}
onMouseLeave={this.onMouseLeaveHandler} >
{this.props.children}
</div>
</div>
);
}
});
var outer = {
height: '120px',
width: '200px',
margin: '100px',
backgroundColor: 'green',
cursor: 'pointer',
position: 'relative'
}
var normal = {
position: 'absolute',
top: 0,
bottom: 0,
left: 0,
right: 0,
backgroundColor: 'red',
opacity: 0
}
var hover = {
position: 'absolute',
top: 0,
bottom: 0,
left: 0,
right: 0,
backgroundColor: 'red',
opacity: 1
}
React.render(
<Hover></Hover>,
document.getElementById('container')
)
la source
Réponses:
Avez-vous essayé l'un d'entre eux?
onMouseDown onMouseEnter onMouseLeave onMouseMove onMouseOut onMouseOver onMouseUp
SyntheticEvent
il mentionne également ce qui suit:
React normalise les événements afin qu'ils aient des propriétés cohérentes dans différents navigateurs.
Les gestionnaires d'événements ci-dessous sont déclenchés par un événement dans la phase de bouillonnement. Pour enregistrer un gestionnaire d'événements pour la phase de capture, ajoutez Capture au nom de l'événement; par exemple, au lieu d'utiliser onClick, vous utiliseriez onClickCapture pour gérer l'événement click dans la phase de capture.
la source
The onMouseEnter and onMouseLeave events propagate from the element being left to the one being entered instead of ordinary bubbling and do not have a capture phase.
Les réponses précédentes sont assez déroutantes. Vous n'avez pas besoin d'un état de réaction pour résoudre cela, ni d'une bibliothèque externe spéciale. Cela peut être réalisé avec du css / sass pur:
Le style:
Le composant React
Une simple
Hover
fonction de rendu pur:Usage
Ensuite, utilisez-le comme ceci:
la source
vous pouvez utiliser
onMouseOver={this.onToggleOpen}
etonMouseOut={this.onToggleOpen}
réfléchir encore et encore sur le composantla source
Si vous pouvez produire une petite démo montrant le bogue onMouseEnter / onMouseLeave ou onMouseDown / onMouseUp, il vaudrait la peine de la publier sur la page des problèmes ou la liste de diffusion de ReactJS, juste pour soulever la question et entendre ce que les développeurs ont à dire à ce sujet.
Dans votre cas d'utilisation, vous semblez impliquer que CSS: hover et: active states serait suffisant pour vos besoins, je vous suggère donc de les utiliser. CSS est des ordres de grandeur plus rapide et plus fiable que Javascript, car il est directement implémenté dans le navigateur.
Cependant, les états: hover et: active ne peuvent pas être spécifiés dans les styles en ligne. Ce que vous pouvez faire, c'est attribuer un ID ou un nom de classe à vos éléments et écrire vos styles soit dans une feuille de style, s'ils sont quelque peu constants dans votre application, ou dans une
<style>
balise générée dynamiquement .Voici un exemple de cette dernière technique: https://jsfiddle.net/ors1vos9/
la source
Une
css
solution simple .Pour appliquer des styles de base, CSS est plus simple et plus performant que les solutions JS 99% du temps. (Bien que les solutions CSS-in-JS plus modernes - par exemple, les composants React, etc. - soient sans doute plus faciles à maintenir.)
Exécutez cet extrait de code pour le voir en action…
la source
more performant that JS solutions 99% of the time
pas vrai. lire des articles démystifiant ce mythe. avez-vous une source?Je viens de rencontrer ce même problème en écoutant les événements onMouseLeave sur un bouton désactivé. Je l'ai contourné en écoutant l'événement natif mouseleave sur un élément qui entoure le bouton désactivé.
Voici un violon https://jsfiddle.net/qfLzkz5x/8/
la source
onMouseLeave
-EventUn package appelé
styled-components
peut résoudre ce problème de manière ELEGANTE .Référence
Exemple
la source
Vous ne pouvez pas avec le style en ligne seul. Ne recommandez pas de réimplémenter les fonctionnalités CSS en JavaScript, nous avons déjà un langage extrêmement puissant et incroyablement rapide pour ce cas d'utilisation - CSS. Alors utilisez-le! Made Style It pour vous aider.
npm install style-it --save
Syntaxe fonctionnelle ( JSFIDDLE )
Syntaxe JSX ( JSFIDDLE )
la source
Utiliser du radium !
Voici un exemple tiré de leur site Web:
la source
J'utiliserais onMouseOver et onMouseOut. Cause dans React
Le voici dans la documentation React pour les événements souris.
la source
J'ai eu un problème similaire lorsque onMouseEnter a été appelé mais parfois l'événement onMouseLeave correspondant n'a pas été déclenché, voici une solution de contournement qui fonctionne bien pour moi (elle repose en partie sur jQuery):
Voir sur jsfiddle: http://jsfiddle.net/qtbr5cg6/1/
Pourquoi cela se passait-il (dans mon cas): J'exécute une animation de défilement jQuery (à travers
$('#item').animate({ scrollTop: 0 })
) en cliquant sur l'élément. Ainsi, le curseur ne quitte pas l'élément "naturellement", mais pendant une animation JavaScript ... et dans ce cas le onMouseLeave n'a pas été déclenché correctement par React (React 15.3.0, Chrome 51, Desktop)la source
Je sais que cela fait un moment que cette question a été posée mais je viens de rencontrer le même problème d'incohérence avec onMouseLeave () Ce que j'ai fait est d'utiliser onMouseOut () pour la liste déroulante et en laissant la souris pour tout le menu, c'est fiable et fonctionne à chaque fois que je l'ai testé. J'ai vu les événements ici dans la documentation: https://facebook.github.io/react/docs/events.html#mouse-events voici un exemple utilisant https://www.w3schools.com/bootstrap/bootstrap_dropdowns.asp :
la source
J'utilise personnellement Style It pour le style en ligne dans React ou je garde mon style séparément dans un CSS ou un SASS fichier ...
Mais si vous êtes vraiment intéressé à le faire en ligne, regardez la bibliothèque, je partage quelques-unes des utilisations ci-dessous:
Dans le composant :
Sortie :
Vous pouvez également utiliser des variables JavaScript avec survol dans votre CSS comme ci-dessous:
Et le résultat comme ci-dessous:
la source
Personnellement, je trouve utiliser Emotion pour gérer de tels styles. Emotion est une bibliothèque CSS-in-JS qui peut rendre la gestion des styles React plus pratique en fonction de vos préférences, par opposition aux styles en ligne comme vous l'avez fait dans votre exemple. Ici vous pouvez trouver plus d'informations à ce sujet https://emotion.sh/docs/introduction espérons que cela vous aidera.
Voici un exemple simple d'Emotion qui ajoute un pointeur et un changement de couleur à un div lors du survol:
la source