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

Redux reducer嵌套状态访问问题:如何正确合并嵌套状态?

解决Redux Reducer嵌套状态访问的TypeError问题

我来帮你拆解下问题根源,再给出可行的解决方案:

  • 第一种写法state.coins.action.coin.name本身语法就错了,动态属性不能用点运算符访问,必须用方括号[]来取值,所以这种写法肯定会触发报错。
  • 第二种写法的问题在于,当某个币种是第一次被处理时,state.coins里还没有[action.coin.name]这个键,此时state.coins[action.coin.name]是undefined,直接展开undefined就会抛出TypeError。

正确的写法

你需要先判断目标嵌套状态是否存在,如果不存在就用空对象兜底,这样展开操作就不会出错了。这里有两种常用的靠谱方式:

方式1:逻辑或运算符(||)兜底

case GET_COIN_PRICE:
  return {
    ...state,
    coins: {
      ...state.coins,
      [action.coin.name]: {
        // 若该币种还未在state中存在,就用空对象代替,避免展开undefined报错
        ...(state.coins[action.coin.name] || {}),
        bithumbPrice: action.bithumbPrice,
        upbitPrice: action.upbitPrice,
        bittrexPrice: action.bittrexPrice
      }
    },
  }

方式2:可选链+空值合并运算符(??)兜底(ES2020+支持)

这种方式更严谨,因为如果state.coins[action.coin.name]是null或者其他合法的假值状态,??只会在值为undefined或null时才返回兜底的空对象:

case GET_COIN_PRICE:
  return {
    ...state,
    coins: {
      ...state.coins,
      [action.coin.name]: {
        ...(state.coins[action.coin.name] ?? {}),
        bithumbPrice: action.bithumbPrice,
        upbitPrice: action.upbitPrice,
        bittrexPrice: action.bittrexPrice
      }
    },
  }

额外小提示

如果你的初始state中coins是一个空对象,那第一次处理某个币种时,state.coins[action.coin.name]就是undefined,上面两种写法都能完美解决问题——既保留了已有的状态(如果有的话),又能顺利合并新的价格数据。

内容的提问来源于stack exchange,提问作者himori123

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:56:25