Đối với React 16 và React> = 15,6
Setter .value=
không hoạt động như chúng ta mong muốn vì thư viện React ghi đè setter giá trị đầu vào nhưng chúng ta có thể gọi hàm trực tiếp trên input
ngữ cảnh 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);
Đối với yếu tố textarea bạn nên sử dụng prototype
các HTMLTextAreaElement
lớp.
Ví dụ về codepen mới .
Tất cả các khoản tín dụng cho người đóng góp này và giải pháp của anh ấy
Câu trả lời lỗi thời chỉ dành cho React <= 15,5
Với react-dom ^15.6.0
bạn có thể sử dụng simulated
cờ trên đối tượng sự kiện để sự kiện đi qua
var ev = new Event('input', { bubbles: true});
ev.simulated = true;
element.value = 'Something new';
element.dispatchEvent(ev);
Tôi đã tạo một codepen với một ví dụ
Để hiểu lý do tại sao cần có cờ mới, tôi thấy nhận xét này rất hữu ích:
Logic đầu vào trong React hiện đã loại trừ các sự kiện thay đổi của nó để chúng không kích hoạt nhiều hơn một lần cho mỗi giá trị. Nó lắng nghe cả các sự kiện onChange / onInput của trình duyệt cũng như thiết lập giá trị nút DOM (khi bạn cập nhật giá trị thông qua javascript). Điều này có tác dụng phụ là nếu bạn cập nhật giá trị của đầu vào theo cách thủ công input.value = 'foo' sau đó gửi một ChangeEvent với {target: input} thì React sẽ đăng ký cả tập hợp và sự kiện, hãy xem giá trị của nó vẫn là '' foo ', hãy coi đó là một sự kiện trùng lặp và nuốt chửng nó.
Điều này hoạt động tốt trong các trường hợp bình thường vì sự kiện khởi tạo trình duyệt "thực" không kích hoạt các tập hợp trên element.value. Bạn có thể bảo đảm bí mật thoát khỏi logic này bằng cách gắn thẻ sự kiện bạn kích hoạt bằng một cờ mô phỏng và phản ứng sẽ luôn kích hoạt sự kiện.
https://github.com/jquense/react/blob/9a93af4411a8e880bbc05392ccf2b195c97502d1/src/renderers/dom/client/eventPlugins/ChangeEventPlugin.js#L128