在我的angular4应用程序中,我有2个列表: “我的朋友列表”和“xys朋友列表”
我将两个列表添加到商店,因为我将它们显示在不同的组件中,并且我希望所有不同的组件能够立即实现对列表的更改。
如果有一位朋友现在更改其“名称”,我就会遇到必须以2分更新商店的问题。在“我的朋友列表”和“xys朋友列表”中。这感觉错误和困惑,很难跟踪。
另一种方法是首先更新数据库中的“名称”,然后重新请求新版本的“我的朋友列表”和“xys朋友列表”。
但这需要花费很多时间,特别是一旦我有更多名单。
那么专业方法是什么?非常感谢你!
答案 0 :(得分:3)
这就是为什么建议保持数据存储(尤其是Redux存储)不变的确切原因。通常,应该有最少量的嵌套,实体应该通过它们的id引用彼此。
最好用一个例子来解释。目前,您的数据可能如下所示:
{
allUsers: [
{
id: 1,
name: 'Foo',
friends: [
{
id: 2,
name: 'Bar',
},
{
id: 3,
name: 'Baz'
}
]
},
{
id: 2,
name: 'Bar',
friends: [
{
id: 3,
name: 'Baz'
}
]
},
{
id: 3,
name: 'Baz',
friends: []
}
]
}
正如您所看到的,有很多嵌套和重复。如果任何用户更改其名称,则在整个商店中传播此更改将很困难,尤其是在更复杂的情况下。但是,如果我们压扁这个结构,它会变得更好:
{
users: {
1: {
id: 1,
name: 'Foo',
friends: [2, 3]
},
2: {
id: 2,
name: 'Bar',
friends: [3]
},
3: {
id: 3,
name: 'Baz',
frineds: []
}
},
allUsers: [1, 2, 3]
}
每个实体都存储在一个特定的地方。其他实体不能包含其数据,但只能通过id引用它,因此无需同步更改。这种方法可以防止许多数据完整性问题(包括您的数据),并最大限度地减少应用程序的内存占用。
至于查询这样的商店,您可以编写将这些数据转换为更便于阅读的形状的函数,并重要假设它们的结果是只读的。在Redux中,这些函数通常称为选择器。