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 le input
contexte as.
var nativeInputValueSetter = Object.getOwnPropertyDescriptor(window.HTMLInputElement.prototype, "value").set;
nativeInputValueSetter.call(input, 'react 16 value');
var ev2 = new Event('input', { bubbles: true});
input.dispatchEvent(ev2);
Pour un élément textarea vous devez utiliser prototype
de HTMLTextAreaElement
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 un simulated
indicateur sur l'objet événement pour que l'événement passe
var ev = new Event('input', { bubbles: true});
ev.simulated = true;
element.value = 'Something new';
element.dispatchEvent(ev);
J'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 logique d'entrée dans React déduplique désormais les événements de modification de sorte qu'ils ne se déclenchent pas plus d'une fois par valeur. Il écoute à la fois les événements onChange / onInput du navigateur ainsi que les ensembles sur le prop de valeur du nœud DOM (lorsque vous mettez à jour la valeur via javascript). Cela a pour effet secondaire de signifier que si vous mettez à jour la valeur de l'entrée manuellement input.value = 'foo', puis envoyez un ChangeEvent avec {target: input} React enregistrera à la fois l'ensemble et l'événement, voir que sa valeur est toujours `` 'foo ', considérez-le comme un événement en double et avalez-le.
Cela fonctionne bien dans les cas normaux car un "vrai" événement lancé par le navigateur ne déclenche pas de jeux sur l'élément element.value. Vous pouvez sortir secrètement de cette logique en étiquetant l'événement que vous déclenchez avec un drapeau simulé et réagir déclenchera toujours l'événement.
https://github.com/jquense/react/blob/9a93af4411a8e880bbc05392ccf2b195c97502d1/src/renderers/dom/client/eventPlugins/ChangeEventPlugin.js#L128