我坚持这一点,我无法进步 - 我想解决方案很简单,但我无法弄清楚。我试图在reducer中添加条目,因此in in中的数据看起来像这样:
state = {
entryId: {
entryName: ["something", "something2", "something3" /* and so on... */]
}
};
到目前为止,这是我得到的最接近的,但是,它不是添加新的唯一条目,而是替换已经存储的条目。此外,我需要能够将此项添加到空状态,其中entryId,entryName尚不存在以避免错误:
switch(type) {
case ADD_ENTRY:
return {
...state,
[entryId]: {
...state[entryId],
[entryName]: {
[uniqueEntry]: true
}
}
};
}
知道我做错了吗?
答案 0 :(得分:22)
如果您尝试将元素添加到entryName
数组的末尾,那么您应该这样做:
return {
...state,
[entryId]: {
...state[entryId],
[entryName]: [
...state[entryId][entryName],
uniqueEntry
]
}
};
使用数组传播的ES6如下:
const array1 = [1, 2, 3];
const array2 = [4, 5, 6];
const eight = 8;
const newArray = ['stuff', ...array1, 'things', ...array2, ...[7, eight], 9];
console.log(newArray); // ["stuff", 1, 2, 3, "things", 4, 5, 6, 7, 8, 9]
查看this gist,其中包含与您正在执行的操作非常相似的示例。
我发现这组例子也非常有用。这里有很多很棒的东西:
https://github.com/sebmarkbage/ecmascript-rest-spread
更新:
如果您在评论中将entryName
初始化为undefined
,则可以执行以下操作:
return {
...state,
[entryId]: {
...state[entryId],
[entryName]: [
...state[entryId][entryName] || [],
uniqueEntry
]
}
};
我认为这是一个非常好的例子,说明使用重度嵌套的数据结构使用React / redux会有多痛苦。 FWIW,它被多次推荐给我,以尽可能地平整你的状态。