Redux Toolkit中的selector是否会触发不相关组件的重渲染?
问题解答
为什么选中用户时UserList没有重渲染
- 你对useSelector的对比逻辑存在偏差:useSelector的引用对比触发重渲染的前提是**selector返回值的引用发生变化,并不是只要返回值是对象类型就一定会触发重渲染。
combineReducers的工作机制决定了,只有被action修改的reducer分片对应的state引用会更新,其余未被修改的分片state引用会完全保持不变。你派发的是仅修改user分片的action,form分片的状态没有被改动,state.form.submittedUser的引用和更新前完全一致,因此submittedUserSelector返回的对象引用没有变化,useSelector对比后判定值相同,UserList自然不会重渲染。- 只有当你在selector中每次主动返回新创建的对象(例如写法为
state => ({user: state.form.submittedUser})),才会出现无论相关状态有没有修改都触发重渲染的问题,你当前的写法只是直接返回state中已有的对象引用,只要原对象没有被修改就不会出现这个问题。
关于selector求值范围的说明
这个能力是React-Redux提供的,和Redux Toolkit没有直接关联:
- 每次store状态更新后,React-Redux会遍历所有调用了useSelector的组件,逐一运行每个组件绑定的selector函数,将返回值和该组件上一次缓存的selector返回值做引用对比,只有对比结果不同时才会触发该组件重渲染。
- 每个组件的selector都是独立计算的,其他reducer的改动只要不影响当前selector的返回值,就不会触发对应组件重渲染。
相关官方说明位置
对应说明可以在React-Redux官方文档的useSelector使用规则章节,以及Redux官方文档的combineReducers工作原理章节查询到。
内容的提问来源于stack exchange,提问作者juanjo12x
相关产品推荐
相关产品推荐

