Nous utilisons le bundle Backbone + ReactJS pour créer une application côté client. En s'appuyant fortement sur des notoires, valueLink
nous propagons les valeurs directement au modèle via notre propre wrapper qui prend en charge l'interface ReactJS pour la liaison bidirectionnelle.
Maintenant, nous avons fait face au problème:
Nous avons un jquery.mask.js
plugin qui formate la valeur d'entrée par programme afin qu'il ne déclenche pas les événements React. Tout cela conduit à une situation où le modèle reçoit des valeurs non formatées de l'entrée de l'utilisateur et manque celles formatées du plugin.
Il semble que React dispose de nombreuses stratégies de gestion des événements en fonction du navigateur. Existe-t-il un moyen courant de déclencher un événement de changement pour un élément DOM particulier afin que React l'entende?
Réponses:
Pour React 16 et React> = 15,6
Setter
.value=
ne fonctionne pas comme nous le voulions car la bibliothèque React remplace le setter de valeur d'entrée, mais nous pouvons appeler la fonction directement sur leinput
contexte as.Pour un élément textarea vous devez utiliser
prototype
deHTMLTextAreaElement
classe.Nouvel exemple de codepen .
Tous les crédits à ce contributeur et à sa solution
Réponse obsolète uniquement pour React <= 15,5
Avec,
react-dom ^15.6.0
vous pouvez utiliser unsimulated
indicateur sur l'objet événement pour que l'événement passeJ'ai fait un codepen avec un exemple
Pour comprendre pourquoi un nouveau drapeau est nécessaire, j'ai trouvé ce commentaire très utile:
la source
Au moins sur les entrées de texte, il semble
onChange
être à l'écoute des événements d'entrée:la source
Event
ne prend pas en charge 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 machine virtuelle IE9 à 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 déclencher un événement sur un composant imbriqué. J'avais une liste avec des widgets de type radio et case à cocher (c'étaient des div qui se comportaient comme des cases à cocher et / ou des boutons radio) et à un autre endroit de l'application, si quelqu'un fermait une boîte à outils, je devais en décocher une.
J'ai trouvé une solution assez simple, je ne sais pas si c'est la meilleure pratique, mais cela fonctionne.
Cela a déclenché l'événement de clic sur le domNode et mon gestionnaire attaché via react a en effet été appelé, il se comporte comme je m'y attendais si quelqu'un cliquait sur l'élément. Je n'ai pas testé onChange mais cela devrait fonctionner, et je ne sais pas comment cela fonctionnera dans les versions vraiment anciennes d'IE, mais je crois que MouseEvent est pris en charge dans au moins IE9 et plus.
Je me suis finalement éloigné de cela pour mon cas d'utilisation particulier car mon composant était très petit (seule une partie de mon application utilisée réagit puisque je suis toujours en train de l'apprendre) et je pourrais réaliser la même chose d'une autre manière sans obtenir de références aux nœuds dom.
METTRE À JOUR:
Comme d'autres l'ont indiqué 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 référence que vous avez attachée à votre composant via<MyComponent ref='refname' />
.la source
React.findDOMNode
fonction. goo.gl/RqccrAref
à votre élément puis utilisezthis.ref.refName.dispatchEvent
Vous pouvez simuler des événements à l'aide de ReactTestUtils, mais c'est conçu pour les tests unitaires.
Je recommanderais de ne pas utiliser valueLink pour ce cas et d'écouter simplement les événements de changement déclenchés par le plugin et de mettre à jour l'état de l'entrée en réponse. Les utilitaires de liaison bidirectionnelle sont plus une démonstration qu'autre chose; ils sont inclus dans des modules complémentaires uniquement pour souligner le fait que la liaison bidirectionnelle pure n'est pas appropriée pour la plupart des applications et que vous avez généralement besoin de plus de logique d'application pour décrire les interactions dans votre application.
la source
ReactTestUtils.Simulate.change(ReactDOM.findDOMNode(this.fieldRef))
S'étendant sur la réponse de Grin / Dan Abramov, cela fonctionne sur plusieurs types d'entrée. Testé dans React> = 15,5
la source
Le déclenchement d'événements de changement sur des éléments arbitraires crée des dépendances entre les composants sur lesquelles il est difficile de raisonner. Il est préférable de s'en tenir au flux de données à sens unique de React.
Il n'y a pas d'extrait de code simple pour déclencher l'événement de modification de React. La logique est implémentée dans ChangeEventPlugin.js et il existe différentes branches de code pour différents types d'entrée et navigateurs. De plus, les détails de mise en œuvre varient selon les versions de React.
J'ai construit react-trigger-change qui fait la chose, mais il est destiné à être utilisé pour des tests, pas comme une dépendance de production:
CodePen
la source
puisque nous utilisons des fonctions pour gérer un événement onchange, nous pouvons le faire comme ceci:
la source
J'ai trouvé ceci sur les problèmes Github de React: Fonctionne comme un charme (v15.6.2)
Voici comment j'ai implémenté une entrée de texte:
la source
Pour
HTMLSelectElement
, ie<select>
la source
Le type d'événement
input
n'a pas fonctionné pour moi,<select>
mais le changer enchange
fonctionnela source
Si vous utilisez Backbone et React, je vous recommande l'un des éléments suivants,
Ils aident tous les deux à intégrer les modèles et les collections Backbone aux vues React. Vous pouvez utiliser les événements Backbone comme vous le faites avec les vues Backbone. Je l' ai touché à la fois et n'a pas vu beaucoup de différence , sauf un est un mixin et les autres changements
React.createClass
àReact.createBackboneClass
.la source