react 模拟向input输入内容
直接使用 input.value = xxx这样是没有用的。后续找到下面代码能够使用
let input = 输入框;
let lastValue = input.value; // 将input现有值保存到变量
input.value = 111; // 设置input的值
let eventb = new Event('input', { bubbles: true }); // 创建一个名为input的自定义事件,允许冒泡
let tracker = input._valueTracker;
if (tracker) {
tracker.setValue(lastValue);
}
input.dispatchEvent(eventb);
还有另一种同样支持react15和16的
let input = someInput;
let lastValue = input.value;
input.value = 'new value';
let event = new Event('input', { bubbles: true }); // 有人反应input无效,change会有效,如果input对你无效时你可以尝试更改
// hack React15
event.simulated = true;
// hack React16 内部定义了descriptor拦截value,此处重置状态
let tracker = input._valueTracker;
if (tracker) {
tracker.setValue(lastValue);
}
input.dispatchEvent(event);
还有更多
对于 React ≥ 15.6.1
const nativeInputValueSetter = Object.getOwnPropertyDescriptor(
window.HTMLInputElement.prototype,
'value').set; // 获取input的原型上value属性的setter方法
nativeInputValueSetter.call(input, newValue); // 设置input的值
const event = new Event('input', { bubbles: true }); // 直接调用上面不会触发react的双向绑定处理(可能?)所以我们要创建一个事件再派遣过去
input.dispatchEvent(event);
对于 React ≤ 15.6.0
input.value = newValue;
const event = new Event('input', { bubbles: true });
event.simulated = true;
input.dispatchEvent(event);
https://github.com/facebook/react/issues/11488
https://chuckconway.com/changing-a-react-input-value-from-vanilla-javascript/
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。