Redux 用户看到的是深度嵌套状态的一部分,可见属性是否应该位于顶层?

Redux 用户看到的是深度嵌套状态的一部分,可见属性是否应该位于顶层?,redux,Redux,我正在做一个游戏。最初,用户在一个地牢中,具有以下属性: //状态 { 健康:95, 生物:[{},{}], 大老板:{}, 是的, 金奖:54, //你明白了吗 } 现在有许多王国和地下城,我们可能希望异步获取这些数据 在用户状态下表示深度嵌套的结构是否更好,在加载时有效地缓存所有其他可能的地下城,并且每次我们想要更新属性时(例如,操作打开\u LIGHT),我们都需要准确地找到我们正在谈论的地下城,或者在我们每次移动到新的地牢时更新顶级属性 下面的状态显示嵌套。大部分信息与我的演示对象和动

我正在做一个游戏。最初,用户在一个地牢中,具有以下属性:

//状态
{
健康:95,
生物:[{},{}],
大老板:{},
是的,
金奖:54,
//你明白了吗
}
现在有许多王国和地下城,我们可能希望异步获取这些数据

在用户状态下表示深度嵌套的结构是否更好,在加载时有效地缓存所有其他可能的地下城,并且每次我们想要更新属性时(例如,操作
打开\u LIGHT
),我们都需要准确地找到我们正在谈论的地下城,或者在我们每次移动到新的地牢时更新顶级属性

下面的状态显示嵌套。大部分信息与我的演示对象和动作无关,它们只关心用户当前所在的一个地牢

//带嵌套的状态
{
健康:95,
王国:0,
地牢:1,
王国:[
{
地下城:[
{
生物:[{},{}],
大老板:{},
是的,
金奖:54
}
{
生物:[{},{},{}],
大老板:{},
莱蒂森:错,
金奖:79
}
{
//...
}
]
}
{
// ...
}
]
}

阻碍我前进的一件事是,所有清洁的减速器,以前只需执行类似于
打开灯
的操作,并更新顶级属性
lightIsOn
,允许非常直接的减速器组成,现在必须进入状态并根据我们当前所在的
王国
地下城
更新正确的属性。有没有一种很好的方法来组合简化程序以保持其整洁?

在Redux中处理嵌套或关系数据的推荐方法是将其规范化,类似于构建数据库的方式。使用ID作为键、项作为值的对象允许通过ID直接查找,使用ID数组指示顺序,并且需要引用项的状态的任何其他部分应只存储ID,而不是项本身。这会使您的状态更平坦,并使更新给定项目更简单

作为其中的一部分,您可以在UI中使用多个级别的连接组件。Redux的一种典型技术是有一个连接的父组件,它检索多个项目的ID,并为每个ID呈现
。然后,连接的子组件将使用该ID查找自己的数据,并将数据传递给它下面的任何表示子组件。从该子树调度的操作将引用项的ID,并且缩减器将能够基于该ID更新正确的规范化项条目

Redux常见问题解答对此主题进行了进一步讨论:。关于Redux性能的一些文章描述了“传递ID”方法,也是一个很好的参考。最后,我只是举了一个例子,说明了一个规范化的状态在过去可能是什么样子

编辑:


作为后续工作,我最近在Redux文档中添加了一个新的部分,主题是。特别是,本节包括关于和的章节。

即使没有嵌套,我的问题仍然存在,只是略有不同:当呈现组件不关心它们时,以及当它们之间的属性相同时,我的代码中是否应该包含所有其他“王国”和“地下城”,我如何组合我的还原器,以便能够干净地更新单个地下城的属性?我可以把我当前的副本作为所有特定于副本的还原器的伪根状态传递吗?我不知道“在我的代码中包含它们”是什么意思。我用进一步的信息和建议更新了我的答案。“在我的代码中包含它们”应该是“在我的状态中包含它们”。不过,不管怎样,我可以处理这个问题。谢谢,当然可以。我还为答案添加了一个链接,因为我在今天的Redux问题列表中写了一个规范化状态的示例。