Async/Await 异常行为:React useState 更新后控制台输出延迟
问题原因
这和Async/Await有关,但核心是React useState的异步更新机制:
setEnviar是异步操作,React为了性能会批量处理状态更新,调用它之后状态不会立刻同步改变,当前函数作用域里的enviar还是更新前的旧值。- 你在
fetchMenu里用await等待了接口响应,但setEnviar本身的异步特性不受影响。所以刚调用完setEnviar就打印enviar,拿到的是初始的true(第一次点击时)。 - 第二次点击时,组件已经完成了上一次的状态更新,此时函数里的
enviar是更新后的false,所以打印结果符合预期。
解决办法
如果要在状态更新后立刻拿到最新值,有两种简单方式:
- 用
useEffect监听状态变化
把依赖最新enviar的逻辑放到useEffect里,状态一变就自动执行:
useEffect(() => { console.log(enviar, userSession.user.id); }, [enviar, userSession.user.id]);
- 先存好计算后的新值
既然已经算出了要设置的新状态,直接把它存成临时变量,之后用这个变量就行:
const fetchMenu= async ()=>{ const response= await fetch('/api/Menu/ListarMenuPorIdUsuario',{ method: 'POST', body: JSON.stringify({ IdUsuario:Number(userSession.user.id) }), headers: { 'Content-type': 'application/json; charset=UTF-8', } }); const data= await response.json(); // 先把新值存起来 const newEnviar = !data.Data.some(e=>e.Nombre==="Administrar"); setEnviar(newEnviar); // 直接打印临时变量,拿到的就是最新值 console.log(newEnviar, userSession.user.id); }
内容的提问来源于stack exchange,提问作者Gustavo
相关产品推荐
相关产品推荐

