如何使用纯js代码去修改react input组件的value值

909 阅读1分钟

前言:具体需求是这样的,有一个网页,里面是一个form表单,但是页面的控件是用react组件,我需要用js原生代码去实现模拟用户输入

当我用常规的方法去修改react组件值得时候,却发现不能修改,具体代码如下(注:以下测试在ant.desig ui组件库官网进行) 1.第一步:首先找到我们需要填写数据的input框 image.png 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);

image.png 看着好像是可以了,但是有问题的,如果你去点击输入好了的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组件写的页面,其他页面暂时还没有测试过,有兴趣的同学可以试试哦