前言:具体需求是这样的,有一个网页,里面是一个form表单,但是页面的控件是用react组件,我需要用js原生代码去实现模拟用户输入
当我用常规的方法去修改react组件值得时候,却发现不能修改,具体代码如下(注:以下测试在ant.desig ui组件库官网进行)
1.第一步:首先找到我们需要填写数据的input框
2.不多说贴代码
方案1:
function setValue(e) {
if (e.fireEvent) e.fireEvent("onchange")
else {
var t = document.createEvent("HTMLEvents")
t.initEvent("change", !1, !0), e.dispatchEvent(t)
}
if (e.fireEvent) e.fireEvent("oninput")
else {
t = document.createEvent("HTMLEvents")
t.initEvent("input", !1, !0), e.dispatchEvent(t)
}
if (e.fireEvent) e.fireEvent("onkeydown")
else {
t = document.createEvent("HTMLEvents")
t.initEvent("keydown", !1, !0), e.dispatchEvent(t)
}
if (e.fireEvent) e.fireEvent("onblur")
else {
t = document.createEvent("HTMLEvents")
t.initEvent("blur", !1, !0), e.dispatchEvent(t)
}
if (e.fireEvent) e.fireEvent("onmouseenter")
else {
t = document.createEvent("HTMLEvents")
t.initEvent("mouseenter", !1, !0), e.dispatchEvent(t)
}
if (e.fireEvent) e.fireEvent("onmouseleave")
else {
t = document.createEvent("HTMLEvents")
t.initEvent("mouseleave", !1, !0), e.dispatchEvent(t)
}
};
let PositionNameInput = $0
PositionNameInput.value = "我是小明";
setValue(PositionNameInput);
看着好像是可以了,但是有问题的,如果你去点击输入好了的input框,你输入的值就会立马消失,当时因为作者本人没有接触过react框架,所以花了很多时间去了解react的组件机制才把问题解决,不多说直接贴解决方案代码
方案2:
function changeReactInputValue(inputDom, newText) {
//inputDom表示你要操作的dom元素
//newText表示你要输入的值
let lastValue = inputDom.value;
inputDom.value = newText;
let event = new Event('input', { bubbles: true });
event.simulated = true;
let tracker = inputDom._valueTracker;
if (tracker) {
tracker.setValue(lastValue);
}
inputDom.dispatchEvent(event);
}
总结:方案1适用于非react组件写的页面,大部分页面适用,方案2针对于react组件写的页面,其他页面暂时还没有测试过,有兴趣的同学可以试试哦