【问题标题】:Update dynamically-deep nested reducer更新动态深度嵌套减速器
【发布时间】:2019-01-21 22:25:06
【问题描述】:

这个问题可能已经被问过几次了,但我还没有找到我的解决方案。

我有一个应用程序可以保存每天的条目,想象一下日记。处理条目的 reducer 的结构如下:

const initial_state = {}

{
  year: {
      month: {
          day: {
              entry: entryValue
            }
        }
    }
}

每当我想在某一天更新现有条目时,我都会这样做:

return {
      ...state,
      [payload.date.year]: {
        ...state[payload.date.year],
        [payload.date.month]: {
          ...state[payload.date.year][payload.date.month],
          [payload.date.day]: payload.data   
        }
      }
    };

问题是,如果用户第一次上传条目,我会收到错误,因为

...state[payload.date.year][payload.date.month],

这会抛出一个错误,说无法从未定义中读取 1(例如在一月份)(因为没有年份,即它只是一个空对象,如 initial_state 中的)。

这让我不得不编写逻辑来处理要采取的行动。我必须先检查是否有条目,然后发送正确的操作。因此,例如,如果它是第一个条目,我会发送这样的操作:

return {
      [payload.date.year]: { 
        [payload.date.month]: {
          [payload.date.day]: payload.data   
        }
      }
    };

我的问题是:有什么方法可以编写 reducer,而不必检查是否存在深层嵌套的键值对?例如检查给定年份是否有条目?

更具体地说,有什么方法可以使它不产生错误:

...state[payload.date.year][payload.date.month],

如果payload.date.year在该州不存在?

【问题讨论】:

    标签: redux react-redux


    【解决方案1】:

    这是使用 JavaScript 短路 的完美案例。我认为这已经足够了:

    ...(state[payload.date.year] || {})[payload.date.month]
    

    有点,但我相信这是最短的答案。该行背后的想法是使用 空对象 作为备用,以防此类属性不存在。

    【讨论】:

    • 非常感谢!我也在考虑这个问题,但在语法上遇到了困难。
    猜你喜欢
    • 2019-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-01
    • 2016-03-28
    • 2017-02-27
    • 2017-07-19
    相关资源
    最近更新 更多