React 16 ve React> = 15.6 için
Setter .value=
istediğimiz gibi çalışmıyor çünkü React kütüphanesi girdi değeri ayarlayıcısını geçersiz kılıyor, ancak işlevi doğrudan input
bağlamda çağırabiliriz .
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);
Textarea elemanı prototype
için HTMLTextAreaElement
class kullanmanız gerekir .
Yeni codepen örneği .
Bu katılımcının ve çözümünün tüm kredileri
Yalnızca React <= 15.5 için eski yanıt
İle , olayın geçmesi için olay nesnesinde bayrak react-dom ^15.6.0
kullanabilirsiniz.simulated
var ev = new Event('input', { bubbles: true});
ev.simulated = true;
element.value = 'Something new';
element.dispatchEvent(ev);
Bir örnekle bir codepen yaptım
Neden yeni bayrağın gerekli olduğunu anlamak için bu yorumu çok yararlı buldum :
React'teki giriş mantığı artık tekilleştirmenin değişiklik olaylarını, değer başına birden fazla tetiklememeleri için. Hem tarayıcıdaki onChange / onInput olaylarını hem de DOM düğüm değeri propundaki kümeleri dinler (değeri javascript aracılığıyla güncellediğinizde). Bu, girdinin değerini elle input.value = 'foo' olarak güncellerseniz, {target: input} ile bir ChangeEvent gönderirseniz, React hem seti hem de olayı kaydeder, değerinin hala `` foo '' olduğuna bakın. ', bunu yinelenen bir olay olarak kabul edin ve yutun.
Bu, normal durumlarda iyi çalışır çünkü tarayıcı tarafından başlatılan "gerçek" bir olay element.value üzerindeki kümeleri tetiklemez. Tetiklediğiniz olayı simüle edilmiş bir bayrakla etiketleyerek bu mantıktan gizlice kurtulabilirsiniz ve tepki her zaman olayı tetikler.
https://github.com/jquense/react/blob/9a93af4411a8e880bbc05392ccf2b195c97502d1/src/renderers/dom/client/eventPlugins/ChangeEventPlugin.js#L128