React+Redux+Hooks场景下如何单独更新Redux Toolkit Slice中单个属性
实现单属性更新有两种常用方案,不需要改动你现有的核心逻辑:
方案1:不修改现有reducer,直接调用原有updateUser方法
调用时先拿到当前的user完整状态,展开后覆盖需要更新的字段即可:
// 先从store中获取当前的user状态 const currentUser = useSelector(state => state.user.value) // 仅更新code字段,其他字段保持原值 dispatch(updateUser({ ...currentUser, code: '你要设置的新code值' }))
这种方式适合临时修改、改动量小的场景,不需要调整slice定义。
方案2:在slice中新增通用单属性更新方法(更推荐)
直接修改你的slice的reducers配置,新增一个通用的字段更新方法,后续所有单属性更新都可以复用:
export const rootSlice = createSlice({ name: "user", initialState: { value: { person_in: null, code: null, surname: null, name: null, active: null, token: null, org_unit: null, available_days: null, current_available_days: null, total_days: null, is_logged_in: false, } }, reducers: { updateUser: (state, action) => { state.value = action.payload }, // 新增通用单属性更新方法 updateUserField: (state, action) => { const { field, value } = action.payload state.value[field] = value } } }); // 导出新增的action export const { updateUser, updateUserField } = rootSlice.actions;
使用的时候直接指定要更新的字段名和值即可,不需要再手动展开原有状态:
// 更新code字段 dispatch(updateUserField({ field: 'code', value: '新code值' })) // 更新其他字段同理,比如更新name dispatch(updateUserField({ field: 'name', value: '张三' }))
注:Redux Toolkit内置了Immer库,允许你直接写修改state的语法,底层会自动转换成符合Redux规范的不可变更新,不需要你手动层层展开对象处理immutable逻辑。
内容的提问来源于stack exchange,提问作者iNemesis
相关产品推荐
相关产品推荐

