react useState 异步回调取不到最新值?见代码
const [fields, setfields] = useState([0]);
function change(){
setTimeout(()=>{
setfields([...fields, 1])
},100)
setTimeout(()=>{
setfields([...fields, 2])
},500)
}
useEffect(() => {
console.log(123,fields )
}, [fields]);
<Button onClick={change}>change</Button>
如何实现输出[0, 1, 2]
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
原因其实在
react
的官方文档里面有提到也就是组件内部的函数拿到的总是定义它的那次渲染中的props和state,文档里面也提到了解决办法:
解决办法1
你的代码修改之后:
相关文档链接:为什么我会在我的函数中看到陈旧的 props 和 state ?
也推荐一篇解析文章,很清晰得解析了这个问题:useEffect 完整指南
解决办法2
第二个解决办法就是楼上提到的方法,文档中是这么说的。
相关文档链接:函数式更新
你的 setFields 在闭包中,会从闭包作用域取 fields 的值。解决办法是使用函数当作 setFields 的参数。
const promise = new Promise();
promise.then(()=>{
const obj = {...state, ...item}
setState(obj)
return obj;
}).then((obj)=>{
setState({...obj, item2})
})
用useState的函数式更新, 代码改成