Redux商店 - 数据库 - 如何传播更改

时间:2017-08-22 13:26:00

标签: redux store propagation

在我的angular4应用程序中,我有2个列表: “我的朋友列表”和“xys朋友列表”

我将两个列表添加到商店,因为我将它们显示在不同的组件中,并且我希望所有不同的组件能够立即实现对列表的更改。

如果有一位朋友现在更改其“名称”,我就会遇到必须以2分更新商店的问题。在“我的朋友列表”和“xys朋友列表”中。这感觉错误和困惑,很难跟踪。

另一种方法是首先更新数据库中的“名称”,然后重新请求新版本的“我的朋友列表”和“xys朋友列表”。

但这需要花费很多时间,特别是一旦我有更多名单。

那么专业方法是什么?非常感谢你!

1 个答案:

答案 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中,这些函数通常称为选择器