Redux NGXS:我们能把数组中的一个对象拆分成一个子状态吗?

Redux NGXS:我们能把数组中的一个对象拆分成一个子状态吗?,redux,ngxs,Redux,Ngxs,我的顶级状态模型如下所示: { listOfItems: [], // Item[] selections: { itemId: 0 } } 项目列表可能包含10种不同的购物项目。 当用户单击某个项目时,它会更新所选内容,我的@Selector将重新运行 操作:设置项目选择 @Action(Item.Select) setState( { setState }: StateContext<ItemsModel>,

我的顶级状态模型如下所示:

{
    listOfItems: [],    // Item[]
    selections: {
        itemId: 0
    }
}
项目列表可能包含10种不同的购物项目。 当用户单击某个项目时,它会更新所选内容,我的
@Selector
将重新运行

操作:设置项目选择

  @Action(Item.Select)
  setState(
    { setState }: StateContext<ItemsModel>,
    { itemId }: Item.Select
  ) {
    setState(patch({ selections: patch({ itemId }) }));
  }
问题是:我最多可以对所选项目执行20个操作。这导致:

  • 大量
    .find()
    查找以在原始数组中查找项(包括选择器和操作)
  • 列表项执行的操作与对特定项执行的操作位于同一位置
  • 我想:将数组和所选内容保持在此状态,但将“所选项目”分离到新的子状态中,子状态的模型只能是项目类型。通过这种方式,我可以将Item上的所有操作封装在与Items[]数组上的操作不同的位置


    我不知道如何保持它们的同步。当父项中的选择项ID更改时,我需要保持“selectedItem”状态为最新状态。我还需要确保selectedItem的任何突变都反映在父元素的原始数组中

    这似乎更像是如何表示应用程序状态的一个基本问题。你有没有想过规范你的物品清单?或者至少使用键/值查找对象而不是数组?您不需要使用.find()进行查找,并且可以通过感兴趣的唯一id访问对象的键。如果有什么帮助,请告诉我

    是的,底线是你是对的,数据结构不是Redux友好的。我想我的问题更多地集中在将
    @操作
    从状态中分离出来,因为有太多的操作,但这不能不将状态分解成更小的部分。将数组映射为键/对象对将解决顶层.find(),但我有许多嵌套数组,因此实际上不可行。主要问题是,应用程序的构建一开始并没有考虑Redux。谢谢你的回答。
    @Selector()
    static getSelectedItem(state: ItemModel): Item {
        return state.itemList.find(i => i.itemId === state.selections.itemId);
    }