You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 16:17:53