สำหรับ React 16 และ React> = 15.6
Setter .value=
ไม่ทำงานตามที่เราต้องการเนื่องจากไลบรารี React แทนที่ตัวกำหนดค่าอินพุต แต่เราสามารถเรียกใช้ฟังก์ชันได้โดยตรงในinput
as context
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 คุณควรใช้prototype
ของHTMLTextAreaElement
ระดับ
ใหม่ตัวอย่างเช่น codepen
เครดิตทั้งหมดให้กับผู้ร่วมให้ข้อมูลนี้และแนวทางแก้ไขของเขา
คำตอบที่ล้าสมัยสำหรับการตอบสนอง <= 15.5 เท่านั้น
ด้วยreact-dom ^15.6.0
คุณสามารถใช้simulated
แฟล็กบนวัตถุเหตุการณ์เพื่อให้เหตุการณ์ผ่านไปได้
var ev = new Event('input', { bubbles: true});
ev.simulated = true;
element.value = 'Something new';
element.dispatchEvent(ev);
ฉันสร้างcodepen ด้วยตัวอย่าง
เพื่อให้เข้าใจว่าเหตุใดจึงต้องตั้งค่าสถานะใหม่ฉันพบว่าความคิดเห็นนี้มีประโยชน์มาก:
ตรรกะการป้อนข้อมูลใน React ตอนนี้อนุมานเหตุการณ์การเปลี่ยนแปลงดังนั้นจึงไม่เริ่มทำงานมากกว่าหนึ่งครั้งต่อค่า มันรับฟังทั้งเหตุการณ์ onChange / onInput ของเบราว์เซอร์รวมทั้งชุดบน DOM node value prop (เมื่อคุณอัปเดตค่าผ่าน javascript) สิ่งนี้มีผลข้างเคียงที่หมายความว่าหากคุณอัปเดตค่าอินพุตด้วยตนเอง input.value = 'foo' จากนั้นส่ง ChangeEvent ด้วย {target: input} การตอบสนองจะลงทะเบียนทั้งชุดและเหตุการณ์ดูว่าค่านั้นยังคงเป็น `` foo 'ให้พิจารณาว่าเป็นเหตุการณ์ที่ซ้ำกันและกลืนมันเข้าไป
วิธีนี้ใช้ได้ดีในกรณีปกติเนื่องจากเหตุการณ์ที่เบราว์เซอร์ "จริง" เริ่มต้นไม่ทริกเกอร์ชุดใน element.value คุณสามารถประกันตัวออกจากตรรกะนี้อย่างลับๆได้โดยการแท็กเหตุการณ์ที่คุณทริกเกอร์ด้วยธงจำลองและการตอบสนองจะทำให้เหตุการณ์เริ่มทำงานเสมอ
https://github.com/jquense/react/blob/9a93af4411a8e880bbc05392ccf2b195c97502d1/src/renderers/dom/client/eventPlugins/ChangeEventPlugin.js#L128