gpt4 book ai didi

javascript - 使用 Object.assign 正确返回嵌套状态

转载 作者:行者123 更新时间:2023-11-29 10:36:17 25 4
gpt4 key购买 nike

我正在开发 React/Redux 应用程序,在大多数情况下,一切都运行顺利。

本质上,它是一个内置分类功能的待办事项应用程序。

当用户在类别中添加待办事项时,我无法在我的 reducer 中正确返回完整的现有状态。

在我发送 ADD_ITEM 操作之前的 redux 状态如下所示:

{
items: {
"HOME": [["Do laundry", "High Priority"],["Feed kids", "Low priority"] ],
"WORK": [["Get promotion", "High priority"],["Finish project", "Medium priority"] ],
"BOTH": [["Eat better", "Medium priority"],["Go for a run", "High priority"] ],

},
settings: {
Test: "test"
}
}

用户导航到一个类别(预制的,尚未实现创建它们)并且可以创建一个具有名称和优先级的新待办事项。这会分派(dispatch)一个操作,该操作会返回一个数组,例如 [category, name, priority]。

目前在我的 reducer 中,我在它成功添加项目的地方拥有它,但它正在清空/覆盖所有现有类别。

我的 reducer 是这样的:

case types.ADD_ITEM:
let cat = action.payload[0];
let name = action.payload[1];
let priority = action.payload[2];
return Object.assign({}, state, { items: { [cat]: [...state.items[cat], [name, priority]]}});

我试过首先使用所有组合项创建一个新对象,如下所示:

let combinedItems = Object.assign({}, state.items, { [cat]: [...state.items[cat], action.payload] });

如果我 console.log 上面的 combinedItems,我得到了我想要的项目的确切对象。但是,我正在努力让 reducer 返回最终对象来反射(reflect)这一点。

当我尝试类似下面的操作时,我得到了一个包含 combinedItems 作为项目内的单独键的对象。

        return Object.assign({}, state, { items: { combinedItems, [cat]: [...state.items[cat], [name, priority]]}});

任何人都可以帮助我获得最终的 redux 状态以包含所有现有类别/项目 + 用户添加的吗?非常感谢您的帮助。

最佳答案

我认为你应该在有数组的地方使用对象。在您的操作负载中,而不是:

[category, name, priority]

你可以拥有:

{category, name, priority}
action.payload.category

我会对您的待办事项进行相同的更改。而不是:

[["Eat better", "Medium priority"], ... ]

你可以拥有:

[{ name: "Eat better", priority: "Medium" }, ... ]

现在,关于是将 items 设置为具有类别键的对象还是将其设置为知道其类别的项目数组更好...好吧,我认为后者更好,如果你得到一个项目,你不需要去它的父级来找出它属于哪个类别。这也会使您的问题更易于管理。

items: [
{
name: "Eat better",
priority: "Medium",
category: "Both"
}, ...
]

将所有这些放在一起解决您的问题:

case types.ADD_ITEM:
let newItem = {
name: action.payload.name,
priority: action.payload.priority,
category: action.payload.category
}
return Object.assign({}, state, { items: [ ...state.items, newItem ] })

无论您之前使用类别作为键所获得的任何好处,对于使用此结构进行重现都是微不足道的。

获取 HOME 类别中的所有项目:

this.props.items.filter(item => item.category === 'HOME')

关于javascript - 使用 Object.assign 正确返回嵌套状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35831745/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com