React Native Redux:关联两个Slice时useSelector取值出现未定义错误
问题分析与解决
你遇到的undefined is not an object错误,核心原因是错误地将slice_2的reducer对象(而非状态值)赋值给了slice_1的initialState,同时Redux的slice状态是独立存储在store不同节点下的,不能直接在一个slice的初始化阶段引用另一个slice的reducer或状态。
错误点拆解
看你的代码:
import slice_2 from './slice_2'; export const slice_1 = createSlice({ name: 'slice_1', initialState: { value: slice_2 // slice_2导出的是reducer函数,不是状态值 }, });
slice_2文件里导出的是slice_2.reducer(一个函数),不是slice_2的状态对象。所以slice_1.initialState.value实际是一个函数,而非预期的数值,后续在组件中访问时自然会抛出类型错误。
正确的实现方式
根据你的需求,分三种场景处理:
场景1:组件需要同时展示两个slice的状态
不需要在slice层面关联,直接在组件中分别获取即可:
// 组件中 const slice1Value = useSelector(state => state.slice_1.value); const slice2Value = useSelector(state => state.slice_2.value); // 直接使用 <Text>{slice2Value}</Text>
场景2:slice_1的逻辑需要依赖slice_2的状态(比如reducer中更新时用到)
在slice_1的reducers或extraReducers中,通过rootState参数获取slice_2的状态:
// slice_1.js import { createSlice } from '@reduxjs/toolkit'; export const slice_1 = createSlice({ name: 'slice_1', initialState: { value: 0 // 先设置合理的初始值 }, reducers: { syncWithSlice2: (state, action, { getState }) => { // 获取整个store的状态,进而拿到slice_2的value const rootState = getState(); state.value = rootState.slice_2.value; } } }); export const { syncWithSlice2 } = slice_1.actions; export default slice_1.reducer;
之后在组件中调用dispatch(syncWithSlice2())即可同步slice_2的状态到slice_1。
场景3:slice_1的初始状态需要复用slice_2的初始值
单独导出slice_2的initialState,然后在slice_1中导入使用:
// slice_2.js import { createSlice } from '@reduxjs/toolkit'; // 单独导出初始状态 export const slice2InitialState = { value: 0 }; export const slice_2 = createSlice({ name: 'slice_2', initialState: slice2InitialState, }); export default slice_2.reducer;
// slice_1.js import { createSlice } from '@reduxjs/toolkit'; import { slice2InitialState } from './slice_2'; export const slice_1 = createSlice({ name: 'slice_1', initialState: { value: slice2InitialState.value // 复用slice_2的初始值 }, }); export default slice_1.reducer;
内容的提问来源于stack exchange,提问作者Daniel Mohebi
相关产品推荐
相关产品推荐

