如何更新由 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”中找到奶酪属性

updateOneupdateMany 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;
    }
  }
}