在Redux中存储列表中选定项的模式

在Redux中存储列表中选定项的模式,redux,react-redux,Redux,React Redux,让我们想象一下,我希望能够在React Redux中选择一个任务。 我应该在哪里存储此状态 第一种解决方案:向任务添加isActive:true属性 第二种解决方案:创建一个新的reducer来处理所选项目的id 我不喜欢这两种解决方案:第一种解决方案让我觉得我在其中存储了与任务无关的东西,第二种解决方案让我觉得创建一个完整的reducer只是为了存储一个id太费劲了 还有其他选择吗?什么是最好的? 谢谢您列出的两个选项都没有什么问题。但是,如果你在寻找其他选择,你可以 1) 在todos re

让我们想象一下,我希望能够在React Redux中选择一个任务。 我应该在哪里存储此状态

第一种解决方案:向任务添加
isActive:true
属性

第二种解决方案:创建一个新的reducer来处理所选项目的id

我不喜欢这两种解决方案:第一种解决方案让我觉得我在其中存储了与任务无关的东西,第二种解决方案让我觉得创建一个完整的reducer只是为了存储一个id太费劲了

还有其他选择吗?什么是最好的?
谢谢

您列出的两个选项都没有什么问题。但是,如果你在寻找其他选择,你可以

1) 在todos reducer状态中包含选定项,使状态对象如下所示:

{
  selected: id,
  list: [{id, text, completed}, ...]
}

2) 如果您不需要应用程序中其他任何位置的所选项目,只需将其存储在您的本地州即可。混合应用程序状态的Redux和组件中单独包含的数据的本地状态没有什么错。

我认为这取决于您的用例

  • 对于一个需要保存大量UI状态的大型应用程序来说,使用一个特殊的缩减器来改变与UI相关的存储部分是非常有意义的

  • 如果可以同时激活多个任务,则每个任务具有
    isActive:boolean
    属性是有效的。尽管从任务数据的角度来看,它与任务无关,但实际上它是从任务的应用程序角度来看的。redux商店的主要目标是成为应用程序的真实来源,而不仅仅是镜像API数据模型

  • 如果您当时只能激活/选择一个任务,那么您也可以有一个
    isActive:id

  • 也可以只使用组件状态。这样做的局限性在于它不会持久存在,也不会被共享。例如,如果希望有“保存”按钮,则该按钮必须位于具有选定状态的组件内


  • 谢谢如果我使用第一个解决方案,一旦我想要修改id,您如何确保新状态是不可变的(并且不引用相同的列表数组)我找到的唯一解决方案是var newState=JSON.parse(JSON.stringify(state))newState.selected=action.idI在这里找到了关于此的更多信息:如果使用第一个解决方案,您只需使用新选定项的id更改selected的值。不需要更改列表的数组。仅当由于添加、删除或更新项而导致列表发生更改时,才可以对数组进行变异。在这种情况下,如果一次只有一个选定项,则更改选定项不会更改项数据本身的任何内容。