Comment vous Placez dans ReactJS? - onMouseLeave pas enregistrés au cours rapide survolez
Comment pouvez-vous obtenir un hover événement ou événement actif ReactJS lorsque vous ne inline style?
J'ai trouvé que la onMouseEnter, onMouseLeave approche est buggé, donc en espérant il y a une autre façon de le faire.
Plus précisément, si vous passez la souris sur un composant très rapidement, seuls les onMouseEnter événement est enregistré. Le onMouseLeave se déclenche jamais, et ne peut donc pas de mise à jour de l'état... en laissant le composant à apparaître comme si c'est encore d'être survolé. J'ai remarqué la même chose si vous essayez d'imiter la ":active" css pseudo-classe. Si vous cliquez sur vraiment rapide, seulement l'événement onMouseDown inscription. L'événement onMouseUp sera ignorée... laissant le composant apparaissant active.
Ici est 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')
)
- Merci pour la suggestion. Je l'ai ré-écrit comme une question maintenant.
- S'il vous plaît ajouter des exemples de code mettant en évidence le problème (de préférence en jsFiddle ou équivalent) comme il est pas encore clair quel est le problème. Qu'entendez-vous par "événement est enregistré"?
Vous devez vous connecter pour publier un commentaire.
Avez-vous essayé l'un de ces?
onMouseDown onMouseEnter onMouseLeave
onMouseMove onMouseOut onMouseOver onMouseUp
https://facebook.github.io/react/docs/events.html
il mentionne également les éléments suivants:
Réagir normalise les événements de sorte qu'ils ont cohérente propriétés à travers les différents navigateurs.
Les gestionnaires d'événements ci-dessous sont déclenchés par un événement dans la phase de propagation. Pour enregistrer un gestionnaire d'événement pour la phase de capture, l'ajout de la Capture de l'événement nom; par exemple, au lieu d'utiliser onClick, vous pouvez utiliser onClickCapture pour gérer l'événement click dans la phase de capture.
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 confus. Vous n'avez pas besoin d'une réaction de l'état pour résoudre ce problème, ni aucune spécial lib externe. Il peut être réalisé avec de la pure css/sass:
Le style:
La Réaction Du Composant
Un simple
Hover
Pur-Rendu-Fonction:Utilisation
Puis l'utiliser comme ceci:
Si vous pouvez produire une petite démo montrant les onMouseEnter /onMouseLeave ou onMouseDown /onMouseUp bug, il serait utile de le poster à ReactJS les questions de page ou une liste de diffusion, juste pour poser la question et d'entendre ce que les développeurs ont à dire à ce sujet.
Dans votre cas, vous semblent indiquer que les CSS :hover et :active les états seraient assez pour vos besoins, alors je vous suggère de les utiliser. CSS est un ordre de grandeur plus rapide et plus fiable que le Javascript, car il est directement mis en œuvre dans le navigateur.
Cependant, :hover et :active les états ne peuvent pas être spécifiées dans des styles en ligne. Ce que vous pouvez faire est d'attribuer un ID ou un nom de classe de vos éléments et écrire vos styles dans une feuille de style, si elles sont un peu constant dans votre application, ou dans un générées dynamiquement
<style>
tag.Voici un exemple de la dernière technique: https://jsfiddle.net/ors1vos9/
vous pouvez utiliser
onMouseOver={this.onToggleOpen}
etonMouseOut={this.onToggleOpen}
de muse sur et sur la composanteJe viens de tombé sur ce même problème lors de l'écoute pour onMouseLeave événements sur un bouton désactivé. J'ai travaillé autour d'elle en l'écoutant pour le natif mouseleave événement sur un élément qui entoure le bouton désactivé.
Ici un violon https://jsfiddle.net/qfLzkz5x/8/
onMouseLeave
-ÉvénementUn paquet appelé
styled-components
pouvez résoudre ce problème en un ÉLÉGANT façon.Référence
Exemple
JS:
HTML:
Un simple
css
seule solution.Pour appliquer des styles de base, le CSS est plus simple et plus performant que JS solutions 99% du temps. (Bien que plus moderne CSS-en-JS les solutions, par exemple. Réagir Composants, etc — sont sans doute plus facile à gérer.)
Exécuter cet extrait de code pour le voir en action...
CSS:
HTML:
more performant that JS solutions 99% of the time
pas vrai. lire les articles de déboulonner ce mythe. avez-vous une source?The fact is that, in most cases, the performance of CSS-based animations is almost the same as JavaScripted animations — in Firefox at least. Some JavaScript-based animation libraries, like GSAP and Velocity.JS, even claim that they are able to achieve better performance than native CSS transitions/animations.
Vous ne pouvez pas avec inline style seul. Ne vous recommandons pas de réimplanter fonctionnalités CSS en JavaScript, nous avons déjà un langage qui est extrêmement puissant et incroyablement rapide construit pour ce cas d'utilisation -- CSS. Afin de l'utiliser! Fait Le Style pour aider.
npm install style-it --save
Syntaxe Fonctionnelle (JSFIDDLE)
JSX Syntaxe (JSFIDDLE)
Utilisation Radium!
L'exemple suivant est un exemple de leur site web:
JS:
J'ai eu un problème similaire lorsque onMouseEnter a été appelé, mais parfois, le correspondant onMouseLeave événement n'est pas déclenché, voici une solution qui fonctionne bien pour moi (il s'appuie partiellement sur jQuery):
Voir sur jsfiddle: http://jsfiddle.net/qtbr5cg6/1/
Pourquoi est-ce qui se passe (dans mon cas): je suis en cours d'exécution jQuery défilement de l'animation (par
$('#item').animate({ scrollTop: 0 })
) lors d'un clic sur l'élément. De sorte que le curseur ne laisse pas l'élément "naturellement", mais lors d'un JavaScript piloté par l'animation ... et dans ce cas, le onMouseLeave n'a pas été déclenché correctement par Réaction (Réagir 15.3.0, Chrome 51, Bureau)Je sais, Ça fait un moment depuis que cette question a été posée, mais je viens de courir dans le même problème d'incompatibilité avec onMouseLeave()
Ce que j'ai fait est d'utiliser onMouseOut() pour que la liste déroulante et de la souris congé pour l'ensemble du menu, il est fiable et fonctionne à chaque fois que je l'ai testé.
J'ai vu ce qui se passe ici dans les docs: https://facebook.github.io/react/docs/events.html#mouse-events
voici un exemple d'utilisation de https://www.w3schools.com/bootstrap/bootstrap_dropdowns.asp:
Personnellement, j'utilise Style Il en ligne de style de Réagir ou de garder mon style séparément dans un CSS ou SASS fichier...
Mais si vous êtes vraiment intéressé à le faire en ligne, regarder à la bibliothèque, je partage certains des usages ci-dessous:
Dans le composant:
Sortie:
Vous pouvez également utiliser des variables JavaScript avec hover en CSS comme ci-dessous :
Et le résultat comme ci-dessous:
Je pourrais vous suggérer un exemple qui a été facile pour moi de comprendre, j'utilise de l'émotion à Réagir JS pour donner les styles.
Ici vous pouvez trouver plus d'informations de https://emotion.sh/docs/introduction espère que cela vous aidera.