如何更新由 EntityAdapter redux 组成的嵌套对象?
how to update a nested object which have made up by EntityAdapter redux?
我使用 redux createEntityAdapter() 来管理我通过 createSlice() 创建的状态,问题是我的状态是嵌套的,我不知道如何更新它
这就是我的状态
{ids: Array(1), entities: {…}, status: 'idle', error: null}
entities:
aLPii2RQz4IWitooG4lqB:
burger:
ingredients: Array(6)
0: {title: 'bread-tops'}
1: {title: 'cheese', Qty: 0}
2: {title: 'meatsss', Qty: 0}
3: {title: 'salad', Qty: 0}
4: {title: 'bacon', Qty: 0}
5: {title: 'bread-bottom'}
length: 6
[[Prototype]]: Array(0)
[[Prototype]]: Object
id: "aLPii2RQz4IWitooG4lqB"
[[Prototype]]: Object
[[Prototype]]: Object
error: null
ids: ['aLPii2RQz4IWitooG4lqB']
status: "idle"
[[Prototype]]: Object
例如,我想增加成分中的奶酪数量
burgerAdapter.updateOne(state, {
id,
changes: { burger: { ingredients: { } } },
});
我不知道应该如何遍历配料数组以在“updateOne”中找到奶酪属性
updateOne
和 updateMany
CRUD 方法只进行浅合并。所以,如果你想更新一个嵌套更深的字段,你有两个选择:
- 首先创建整个新的
ingredients
数组
- 不要在此处使用 CRUD 方法 - 将更新逻辑编写为普通的基于 Immer 的“变异”状态更新
我个人会选择第二种方法。您已经有了项目的 ID,只有一件事需要更新。所以,这应该有效:
ingredientAdded(state, action) {
const {id, ingredientName} = action.payload;
const item = state.entities[id];
if (item) {
const ingredient = item.ingredients.find(ingredient => ingredient.title === ingredientName);
if (ingredient) {
ingredient.Qty += 1;
}
}
}
我使用 redux createEntityAdapter() 来管理我通过 createSlice() 创建的状态,问题是我的状态是嵌套的,我不知道如何更新它
这就是我的状态
{ids: Array(1), entities: {…}, status: 'idle', error: null}
entities:
aLPii2RQz4IWitooG4lqB:
burger:
ingredients: Array(6)
0: {title: 'bread-tops'}
1: {title: 'cheese', Qty: 0}
2: {title: 'meatsss', Qty: 0}
3: {title: 'salad', Qty: 0}
4: {title: 'bacon', Qty: 0}
5: {title: 'bread-bottom'}
length: 6
[[Prototype]]: Array(0)
[[Prototype]]: Object
id: "aLPii2RQz4IWitooG4lqB"
[[Prototype]]: Object
[[Prototype]]: Object
error: null
ids: ['aLPii2RQz4IWitooG4lqB']
status: "idle"
[[Prototype]]: Object
例如,我想增加成分中的奶酪数量
burgerAdapter.updateOne(state, {
id,
changes: { burger: { ingredients: { } } },
});
我不知道应该如何遍历配料数组以在“updateOne”中找到奶酪属性
updateOne
和 updateMany
CRUD 方法只进行浅合并。所以,如果你想更新一个嵌套更深的字段,你有两个选择:
- 首先创建整个新的
ingredients
数组 - 不要在此处使用 CRUD 方法 - 将更新逻辑编写为普通的基于 Immer 的“变异”状态更新
我个人会选择第二种方法。您已经有了项目的 ID,只有一件事需要更新。所以,这应该有效:
ingredientAdded(state, action) {
const {id, ingredientName} = action.payload;
const item = state.entities[id];
if (item) {
const ingredient = item.ingredients.find(ingredient => ingredient.title === ingredientName);
if (ingredient) {
ingredient.Qty += 1;
}
}
}