从子组件返回保存数据时获取useState列表初始值而非当前状态问题
问题原因
这是典型的React函数组件闭包陷阱:
- off-canvas组件初始化时绑定的save回调,捕获的是组件首次渲染时的初始state快照,你在save方法里打印list拿到初始值,就是因为回调捕获的是首次渲染时的list变量,和后续更新的state不是同一个引用
- 后续state更新后,已经完成绑定的旧save回调不会自动更新持有的state引用,所以每次保存时都是基于初始state计算新值,自然会覆盖之前的修改
- 其中一个编辑器运行正常,是因为它的触发逻辑会导致off-canvas组件重新挂载,重新绑定了持有最新state的新save回调,另外两个编辑器没有触发重新挂载,一直使用首次渲染生成的旧回调。
可行解决方案
- 使用函数式state更新:修改save方法里的setState写法,使用函数入参获取最新state,避免依赖外部state变量,示例写法:
// 错误写法 依赖外部state变量易触发闭包问题 setList([...list, modifiedItem]) // 正确写法 函数式更新自动获取最新state setList(prevList => { const updatedList = [...prevList] // 执行对应项的修改逻辑 return updatedList })
- 用useRef同步最新state:声明一个ref变量,每次list更新时同步把最新值赋值给ref.current,save回调里直接从ref.current取最新值操作。
- 每次打开off-canvas时重新绑定save回调,保证回调持有的是当前最新的state引用。
内容的提问来源于stack exchange,提问作者Cheshiremoe
相关产品推荐
相关产品推荐

