React state更新是异步的,为何表单提交后直接重置输入字段的操作能正常生效?
问题解答
核心原因是你对React状态异步更新的理解存在常见误区,异步更新的规则完全不会影响这段代码的执行逻辑:
- React的
setState异步更新,指的是调用set方法后,不会立即修改当前渲染闭包内的state变量,也不会立刻触发重渲染,所有的状态更新请求会先缓存,等到当前同步代码全部执行完毕后再批量处理、触发下一次重渲染,而不是说set方法本身会被延迟执行。 - 你进入
submitHandler函数时,用到的title、amount、date都是本次渲染周期闭包里的固定值,你在函数任何位置读取这三个变量,拿到的都是同一个值,不会被后续的set调用修改。 - 你先读取这三个值组装
dataObj的时候,已经拿到了当前的最新状态值完成了数据组装。后续的三个set调用只是提交了「下次渲染时把这三个状态设为空字符串」的请求,要等到整个submitHandler执行完才会生效,完全不会影响你已经组装好的dataObj,也不会出现还没读值就被清空的问题。
补充说明:如果你在set调用之后立刻打印这三个state变量,会发现打印出来的还是旧值,就是因为当前闭包里的state不会被本次的set调用修改,要下一次渲染才会拿到新值。
内容的提问来源于stack exchange,提问作者Seher Mahmud
相关产品推荐
相关产品推荐

