在 React 16 中(包括 React 15.6 及之后的版本),如果想要用 JavaScript 在外部触发一个 input
组件的 onChange
事件,需要做如下的几个事情:
- 首先,让 React 记录下新的
value
值。React 通过defineProperty
封装了value
的set
方法,因而直接调用input.value = xxx
并不能达到预期的效果(实际触发的是 React 封装的 setter,而不是实际 DOM 的 setter)。为此,可以使用如下的方法绕过去:
var input = document.querySelector('.xxx');
var originalSetter =
Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, 'value').set;
originalSetter.call(input, 'your value here');
- 其次,需要触发一次
onChange
的事件,好让 React 的组件可以在原来既定的回调函数中处理新的数据:
var event = new Event('input', { bubbles: true });
input.dispatchEvent(event);
以下是一个完整可用的方法:
function change(input, value) {
const setter =
Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, 'value').set;
setter.call(input, value);
const event = new Event('input', { bubbles: true });
input.dispatchEvent(event);
}