当前位置: 首页 > Web前端 > HTML

useState批处理的坑

时间:2023-03-28 14:27:41 HTML

学习react时,关于state生效的时机,官方表示多个状态同时执行时会合并(批处理)。在学习hooks的时候,状态相关的useHooks也被认为是同一批。比如下面的代码:importReact,{useState,useEffect}from'react';从'react-dom'导入ReactDOM;constDemo=()=>{const[a,setA]=useState('');const[b,setB]=useState('');useEffect(()=>{console.log('触发更新拉取');},[a,b]);返回({setA(String(Math.random()));setB(String(Math.random()));}}>test);};ReactDOM。render(,document.getElementById('容器'),);再次点击时,会发现只触发了一次,state的set函数已经被批处理了。但是把上面的代码改一下:importReact,{useState,useEffect}from'react';从'react-dom'导入ReactDOM;constDemo=()=>{const[a,setA]=useState('');const[b,setB]=useState('');useEffect(()=>{console.log('触发更新拉取');},[a,b]);return({setTimeout(()=>{setA(String(Math.random()));setB(String(Math.random()));},300);}}>测试);};ReactDOM.render(,document.getElementById('container'),);这个时候点击之后,你会发现触发了两次,而且state的set函数没有被批量处理!查阅资料后发现这是reacthooks机制的一个缺陷,react18会修复这个缺陷,文档在这里:https://github.com/reactwg/react-18/discussions/21根据看文档,不仅setTimeout批处理会失败,像Promise.then这样的函数也会失败。