React useCallback更新Redux Store值后,能否立即获取最新值?
关于Redux Store更新与React useCallback的状态捕获问题
问题1:刚完成Redux Store值更新的React useCallback方法中,该值是否处于最新状态?
答案是不一定,核心要抓住useCallback的闭包特性:
useCallback会根据依赖数组创建并缓存函数实例,每个实例捕获的都是它被创建时的变量快照。- 当你调用
dispatch更新Redux Store后,Store的值会同步更新,但组件的重新渲染要等到下一个渲染周期才会触发。 - 所以在当前渲染周期内的
useCallback函数实例里,它持有的仍然是更新前的旧值;只有等组件重新渲染完成,基于新的Store值创建的新useCallback实例,才会持有最新的状态。
问题2:调用useCallback方法更新依赖数组中的Redux Store值,能立即获取更新后的值吗?
直接给结论:控制台会打印5,而不是10,具体原因拆解:
- 你的
doSomething函数是基于当前value=5创建的useCallback实例,它的闭包里已经牢牢捕获了value=5这个快照。 - 虽然
dispatch(changeValue(10))是同步操作,会立刻更新Redux Store里的值,但这并不会改变当前doSomething函数闭包中已经捕获的value——闭包抓的是变量创建时的引用快照,而非实时指向Store的动态指针。 - 只有等组件重新渲染(Store更新触发
useSelector订阅,导致组件重渲染),才会生成新的doSomething实例,这时候它的依赖数组[value]里的value才是10,下次调用这个新实例时才会打印10。
简单总结:useCallback里的变量值由它创建时的渲染周期决定,和Store是否已经更新无关——Store更新只会触发组件重渲染,进而生成持有新值的useCallback实例,但当前正在执行的旧实例不会受到任何影响。
内容的提问来源于stack exchange,提问作者Ryan Pergent
相关产品推荐
相关产品推荐

