Quel est le meilleur moyen de déclencher l'événement onchange de réagir js
Nous utilisons épine Dorsale + ReactJS bundle pour construire une côté client app.
Dépendant de la tristement célèbre valueLink
nous propager les valeurs directement au modèle via son propre wrapper qui prend en charge ReactJS interface pour les deux sens de la liaison.
Maintenant, nous sommes confrontés au problème:
Nous avons jquery.mask.js
plugin qui formats d'entrée valeur par programme n'a donc pas le feu à Réagir à des événements. Tout cela conduit à une situation où le modèle reçoit non formaté valeurs à partir de la saisie de l'utilisateur et manque formaté ceux de plugin.
Il semble que Réagir a beaucoup de la gestion des événements des stratégies en fonction du navigateur. Est-il de toute façon courante pour déclencher un changement événement particulier de l'élément DOM sorte qui Réagissent va l'entendre?
Vous devez vous connecter pour publier un commentaire.
Pour Réagir 16 et Réagir >=15.6
Setter
.value=
ne fonctionne pas comme nous le voulions en raison de Réagir de la bibliothèque remplace la valeur d'entrée du setter mais nous pouvons appeler la fonction directement sur lainput
comme contexte.Pour les textarea élément que vous devez utiliser
prototype
deHTMLTextAreaElement
classe.Nouveau codepen exemple.
Tous les crédits à ce contributeur et sa solution
Réponse dépassée seulement pour Réagir <=15.5
Avec
react-dom ^15.6.0
vous pouvez utilisersimulated
drapeau sur l'objet d'événement pour l'événement de passer à traversJ'ai fait un codepen avec un exemple
De comprendre pourquoi le nouveau drapeau est nécessaire, j'ai trouvé ce commentaire très utile:
var curValue = input.value; input.value = ''; nativeInputValueSetter.call(input, curValue);
et puis envoi d'entrée de l'événementAu moins sur des saisies de texte, il semble que
onChange
est à l'écoute pour des événements d'entrée:Event
n'est pas de soutenir IE https://developer.mozilla.org/en-US/docs/Web/API/Event/Eventvar event = document.createEvent('CustomEvent'); event.initCustomEvent('input', true, false, { });
, mais je n'ai pas de IE9 VM à portée de main.var evt = document.createEvent('CustomEvent'); evt.initCustomEvent('input', true, false, { }); document.getElementById('description').value = 'I changed description'; document.getElementById('description').dispatchEvent(evt);
Je sais que cette réponse arrive un peu tard mais j'ai récemment été confronté à un problème similaire. Je voulais le déclenchement d'un événement sur un ensemble de composants. J'avais une liste avec la radio et la case à cocher type de widgets (ils ont été les divs qui se comportaient comme des cases à cocher et/ou des boutons radio) et dans un autre endroit dans l'application, si quelqu'un a fermé une boîte à outils, j'avais besoin de le décocher.
J'ai trouvé une jolie solution simple, ne sais pas si c'est la meilleure pratique, mais il fonctionne.
Cela déclenche l'événement click sur le domNode et mon gestionnaire attaché à réagir a été en effet appelé ainsi, il se comporte comme je attendre si quelqu'un a cliqué sur l'élément. Je n'ai pas testé onChange, mais il doit travailler, et ne sais pas comment cela va juste très anciennes versions d'IE, mais je crois que le MouseEvent est pris en charge dans au moins IE9 et jusqu'.
J'ai finalement abandonné ce pour mon cas d'utilisation particulier parce que mon composant, était très faible (seulement une partie de mon application utilisée réagir puisque je suis encore à apprendre) et j'ai pu réaliser la même chose d'une autre manière sans obtenir des références pour les nœuds dom.
Mise à JOUR:
Comme d'autres l'ont dit dans les commentaires, il est préférable d'utiliser
this.refs.refname
pour obtenir une référence à un nœud dom. Dans ce cas, refname est la ref que vous avez joint à votre composant via<MyComponent ref='refname' />
.React.findDOMNode
fonction. goo.gl/RqccrAref
à votre élément, puis utiliserthis.ref.refName.dispatchEvent
Vous pouvez simuler des événements à l'aide de ReactTestUtils mais qui est conçu pour les tests unitaires.
J'avais recommandé de ne pas utiliser valueLink pour ce cas et simplement à l'écoute de changer les événements déclenchés par le plugin et la mise à jour de l'entrée de l'état dans la réponse. La liaison bidirectionnelle utils plus une démo qu'autre chose; ils sont inclus dans addons que pour souligner le fait que pure liaison bidirectionnelle n'est pas approprié pour la plupart des applications et que vous avez généralement besoin de plus d'une logique d'application de décrire les interactions dans votre application.
ReactTestUtils.Simulate.change(ReactDOM.findDOMNode(this.fieldRef))
Le déclenchement des événements de changement arbitraire et les éléments crée des dépendances entre les composants qui sont difficiles à comprendre. Il est préférable de s'en tenir à Réagir d'une façon de flux de données.
Il n'est pas simple extrait de déclencher Réagir de l'événement de changement. La logique est à l'œuvre dans ChangeEventPlugin.js et il y a différentes branches de code pour les différents types d'entrée et de navigateurs. En outre, les détails de mise en œuvre varient selon les versions de Réagir.
J'ai construit réagir-déclencheur de changement que le fait de la chose, mais il est destiné à être utilisé pour le test, non pas comme une production de la dépendance:
CodePen
Expansion sur la réponse de Sourire/Dan Abramov, cela fonctionne à travers plusieurs types d'entrée. Testé dans Réagissent >= 15.5
eh bien, puisque nous utilisons des fonctions pour gérer un événement onchange, nous pouvons le faire comme ceci:
J'ai trouvé ceci sur Réagir de Github questions: Fonctionne comme un charme (v15.6.2)
Voici comment j'ai mis en place pour une saisie de Texte:
Si vous utilisez de la Dorsale et de Réagir, je vous recommande l'une des opérations suivantes,
Ils ont tous deux aider à intégrer la Dorsale des modèles et des collections de Réagir avec vues. Vous pouvez utiliser l'épine Dorsale des événements comme vous le feriez avec épine Dorsale de vues. J'ai essayé les deux et n'ai pas vu beaucoup de différence, sauf un, est un mixin et les autres changements
React.createClass
àReact.createBackboneClass
.