React中Redux Store如何将数据按ID而非索引存储?
嘿,我来帮你把Redux里的数组存储改成按ID作为键的对象存储,这样你就能直接用postId(比如41)来定位数据,不用再依赖索引0、1这些啦。咱们一步步修改你的reducer:
1. 把初始状态从数组改成对象
原来的初始state是[],现在换成空对象{}——因为咱们要以postId作为键来存储每条评分数据,对象结构刚好适合这种键值对的存储需求。
2. 重写RATE_POST的新增逻辑
原来用unshift往数组头部加元素,现在直接给对象赋值:用action.postId作为键,把对应的评分对象存进去。这样新增的数据就会自动以它的postId作为键,比如你说的41,而不是默认的索引0。
3. 修复RATE_POST_UPDATE的更新逻辑
原来的写法有问题:map返回的是新数组,你直接在后面加.rate根本找不到要更新的项。现在咱们直接通过postId访问对象里的对应条目,只要存在就更新它的rate值,简单又高效。
修改后的完整reducer代码:
export function ratedPosts(state = {}, action) { enableES5() return produce(state, draft => { const rate = action.Rate switch (action.type) { case RATE_POST: // 用postId作为键存储评分对象 draft[action.postId] = { postId: action.postId, rate: rate } break case RATE_POST_UPDATE: // 先确认条目存在,再更新评分 if (draft[action.postId]) { draft[action.postId].rate = rate } break default: return draft } }) }
修改后,你的ratedPosts状态会变成这样的结构:
{ 41: { postId: 41, rate: 5 }, 123: { postId: 123, rate: 3 }, // 其他postId对应的评分数据 }
之后在组件里访问某个帖子的评分时,直接用state.ratedPosts[targetPostId]就能拿到,不用再遍历数组查找,效率提升不少哦~
内容的提问来源于stack exchange,提问作者altF4
相关产品推荐
相关产品推荐

