更新动态深层嵌套的reducer

时间:2019-01-21 13:56:14

标签: redux react-redux

可能已经问过几次这个问题,但是我还没有找到解决方法。

我有一个应用程序,可以每天保存一个条目,想象一下日记。处理条目的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   
        }
      }
    };

我的问题是:是否可以通过某种方式编写化简版,而不必检查深层嵌套键-值对的存在?例如,例如检查给定年份中是否有条目?

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

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

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

1 个答案:

答案 0 :(得分:1)

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

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

有点丑陋,但我认为这是最短的答案。该行后面的想法是使用空对象作为后备,以防该属性不存在。