使用createSlice时reducer与selector访问Redux store规则为何有差异?
Redux createSlice 分片操作与Selector入参的设计差异原因
这两个场景下操作的状态对象本质完全不同,不存在设计不对称的问题,核心差异是两个功能的职责定位不同:
1. 切片reducer内的入参是分片局部状态
- 你在调用
createSlice时传入的切片名称(比如示例中的person),会在configureStore配置时作为根状态的key,和该切片的reducer做绑定。 - 每次对应切片的reducer被触发时,Redux Toolkit 内部会自动把根状态下
store.person这部分的局部状态作为入参传入reducer,你自然可以直接操作这个局部状态的属性,不需要额外加person前缀,这是框架做的语法糖封装,目的是简化分片reducer的编写逻辑,同时也限制单个reducer只能修改自己负责的分片状态,避免越权修改其他分片的数据。 - 你提到的直接写
state.firstName = 'Bernhard'即可完成赋值的能力,是Redux Toolkit默认集成Immer库提供的不可变操作语法糖,和分片设计没有直接关联,底层还是会生成符合Redux规范的新不可变状态。
2. Selector的入参是全局根状态
- Selector 本质是通用的状态取值函数,设计上不绑定任何特定切片,默认传入完整的Redux根状态是为了保证灵活性:你可以在同一个selector内访问多个不同分片的状态做聚合计算,比如同时取
person.firstName和account.vipLevel来拼接用户的完整展示名。 - 如果想简化同分片下的selector写法,可以手动封装绑定分片路径的基础selector,后续派生选择器都基于它编写,就不需要重复写分片前缀:
// 封装person分片的基础选择器 const selectPersonState = (rootState) => rootState.person; // 派生selector直接基于基础选择器取值,不需要再写根状态路径 const firstNameSelector = (rootState) => selectPersonState(rootState).firstName;
内容的提问来源于stack exchange,提问作者B.Anzeletti
相关产品推荐
相关产品推荐

