React Native集成Redux:是否需预先在initialState定义所有状态?
Redux初始化initialState是否必须预先定义所有模块?
结论:不是必须预先定义所有模块,完全可以后续动态向store中新增数据项
Redux的状态本质就是普通JavaScript对象,只要在reducer处理对应action时,返回包含新字段的状态对象即可。比如你初始的initialState只有
users: [],当需要添加posts数据时,在reducer里这么写:
const initialState = { users: [] }; function rootReducer(state = initialState, action) { switch(action.type) { case 'FETCH_POSTS_SUCCESS': // 展开原有state,新增posts字段 return { ...state, posts: action.payload }; // 其他action处理逻辑 default: return state; } }
这样store的状态里就会新增posts字段,后续组件可以正常读取。
教程里预先定义所有字段的原因,主要是避免组件读取未定义字段时抛出错误。比如组件里写
state.posts.map(...),如果posts没预先定义也没通过reducer新增,就会因为undefined.map()报错。如果选择动态新增字段,建议在组件里做防御性处理:- 使用可选链:
state.posts?.map(...) - 或者默认值兜底:
(state.posts || []).map(...)
- 使用可选链:
对于后续不确定的events、organisations这类模块,同样可以用这种方式动态添加。如果用Redux Toolkit(现在官方推荐的写法),每个模块可以通过
createSlice单独定义自己的初始状态,组合reducer时自动整合到全局state里,更灵活且不易出错,但即使不用Toolkit,原生Redux也完全支持动态扩展状态字段。
内容的提问来源于stack exchange,提问作者Dominic Smith
相关产品推荐
相关产品推荐

