Redux 动态更新深嵌套减速器
这个问题可能被问了好几次,但我还没有找到解决办法 我有一个应用程序,可以每天保存一个条目,想象一下一本日记。处理条目的reducer的结构如下:Redux 动态更新深嵌套减速器,redux,react-redux,Redux,React Redux,这个问题可能被问了好几次,但我还没有找到解决办法 我有一个应用程序,可以每天保存一个条目,想象一下一本日记。处理条目的reducer的结构如下: const initial_state = {} { year: { month: { day: { entry: entryValue } } } } 每当我想在给定日期更新现有条目时,我都会执行以下操作: return {
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],
这将抛出一个错误,说明无法从undefined读取1(例如在1月份)(因为没有年份,即它只是一个空对象,就像初始状态一样)
这使得我必须编写逻辑来处理要采取的操作。我必须先检查是否有条目,然后发送正确的操作。例如,如果它是有史以来的第一个条目,我将发送一个如下操作:
return {
[payload.date.year]: {
[payload.date.month]: {
[payload.date.day]: payload.data
}
}
};
我的问题是:有没有任何方法可以不用检查深层嵌套键值对的存在来编写约简?例如,检查给定年份中是否有条目
更具体地说,是否有任何方法使其不产生错误:
...state[payload.date.year][payload.date.month],
如果状态中不存在
有效负载.date.year
?这是使用JavaScript短路的理想情况。我认为这就足够了:
...(state[payload.date.year] || {})[payload.date.month]
这有点难看,但我相信这是最简短的答案。这条线背后的想法是使用空对象作为后备,以防此类属性不存在。非常感谢!我也在考虑这个问题,但在语法方面遇到了困难。