React Native Redux:如何在Reducer中设置Action Creator传递的数组
看起来你已经走对了大半路啦!处理数组其实和处理对象的逻辑核心是一致的,只是在reducer里初始化和更新状态的方式要对应数组的特性~我帮你把代码补全并拆解清楚:
第一步:补全你的 Action Creator
先修正你代码里的小笔误(payloa应该是payload),同时推荐把Action类型抽成常量,避免拼写错误:
// 定义Action类型常量(推荐写法,减少出错概率) export const LOAD_USER_ITEMS = 'LOAD_USER_ITEMS'; export const loadUserItems = () => { return async function(dispatch) { const url_current = 'https://whateverapi'; const response = await axios.get(url_current); const items = response.data.items; // 把接口返回的数组传入Action并dispatch dispatch(loadItems(items)); } } // 完善Action创建函数,这里的payload就是你要传递的数组 function loadItems(data) { return { type: LOAD_USER_ITEMS, payload: data } }
第二步:编写对应Reducer处理数组状态
因为要存储数组,所以初始化状态要设为空数组,更新时直接将数组赋值到对应字段即可(如果是追加数组而非替换,可以用展开运算符合并):
import { LOAD_USER_ITEMS } from './你的action文件路径'; // 初始化状态:userItems设为空数组 const initialState = { userItems: [] }; const userItemsReducer = (state = initialState, action) => { switch(action.type) { case LOAD_USER_ITEMS: return { ...state, // 展开原state,保留其他状态不变 userItems: action.payload // 将数组存入state的userItems字段 }; // 其他Action的处理逻辑... default: return state; } } export default userItemsReducer;
第三步:在组件中使用数组状态
用Redux Hooks获取状态并触发Action,就可以在组件里渲染数组内容了:
import { useSelector, useDispatch } from 'react-redux'; import { useEffect } from 'react'; import { loadUserItems } from './你的action文件路径'; function UserItemsComponent() { const dispatch = useDispatch(); // 从Redux State中取出数组(路径要和你的Store配置对应) const userItems = useSelector(state => state.userItems.userItems); // 组件挂载时触发数据加载 useEffect(() => { dispatch(loadUserItems()); }, [dispatch]); // 渲染数组列表 return ( <div> <h3>我的物品</h3> <ul> {userItems.map(item => ( // 记得给每个列表项加唯一key,这里假设item有id字段 <li key={item.id}>{item.name}</li> ))} </ul> </div> ); } export default UserItemsComponent;
额外小提示
- 如果需要对接口返回的数组做预处理(比如过滤、字段转换),可以在
dispatch(loadItems(items))之前完成,再把处理后的数组传给Action。 - 如果是要追加数组而非完全替换,Reducer里可以写成:
userItems: [...state.userItems, ...action.payload]
内容的提问来源于stack exchange,提问作者WaLinke
相关产品推荐
相关产品推荐

