Javascript 非规范化数据如何在react redux中引起问题?
看着redux的reddit文档,Dan说:Javascript 非规范化数据如何在react redux中引起问题?,javascript,reactjs,redux,normalization,react-redux,Javascript,Reactjs,Redux,Normalization,React Redux,看着redux的reddit文档,Dan说: { selectedSubreddit: 'frontend', postsBySubreddit: { frontend: { isFetching: true, didInvalidate: false, items: [] }, reactjs: { isFetching: false, didInvalidate: false, lastU
{
selectedSubreddit: 'frontend',
postsBySubreddit: {
frontend: {
isFetching: true,
didInvalidate: false,
items: []
},
reactjs: {
isFetching: false,
didInvalidate: false,
lastUpdated: 1439478405547,
items: [
{
id: 42,
title: 'Confusion about Flux and Relay'
},
{
id: 500,
title: 'Creating a Simple Application Using React JS and Flux Architecture'
}
]
}
}
}
在本例中,我们将接收的项目与
分页信息。但是,如果您
具有相互引用的嵌套实体,或者如果允许用户
编辑项目。假设用户想要编辑一篇获取的文章,但是
post在状态树中的多个位置重复。这将是
实施起来真的很痛苦
有人能解释一下他所指的分页信息是什么吗?另外,如果用户想要编辑获取的帖子,它会是什么样子?这是如何导致一篇文章在状态树中的几个地方被复制的?我相信lastUpdated属性就是他引用的分页数据;它可以用于(取决于API)提取自上次更新以来所做的更改 您对规范化的困惑是可以理解的,因为他没有提供一个非规范化方法不好的例子——尽管在文档的下一段中,他提供了一个规范化结构在需要它的情况下是什么样子的例子
但是考虑一下这个场景:我们仍然在管理一个跟踪“帖子”的数据集,这是“UpReDITs”的一部分。但现在我们考虑到了单个帖子是“交叉发布”的可能性,我们将其表示为每个交叉发布的subreddit对象中都包含相同的单个帖子
假设42号邮筒是交叉张贴的。现在,非规范化状态如下所示:{
selectedSubreddit: 'frontend',
postsBySubreddit: {
frontend: {
isFetching: true,
didInvalidate: false,
items: [ {
id: 42,
title: 'Confusion about Flux and Relay'
}
]
},
reactjs: {
isFetching: false,
didInvalidate: false,
lastUpdated: 1439478405547,
items: [
{
id: 42,
title: 'Confusion about Flux and Relay'
},
{
id: 500,
title: 'Creating a Simple Application Using React JS and Flux Architecture'
}
]
}
}
}
现在用户正在查看subreddit'reactjs',并希望编辑帖子42的标题。我们也应该在subreddit“frontend”下更新同一篇文章的标题,但如果没有对我们州进行全面搜索,我们无法知道这一点。因此,我们要么进行代价高昂的搜索,要么引入数据完整性问题
标准化后,此状态将类似于:
{
selectedSubreddit: 'frontend',
posts: {
42: {
id: 42,
title: 'Confusion about Flux and Relay'
},
500: {
id: 500,
title: 'Creating a Simple Application Using React JS and Flux Architecture'
}
},
postsBySubreddit: {
frontend: {
isFetching: true,
didInvalidate: false,
items: [42]
},
reactjs: {
isFetching: false,
didInvalidate: false,
lastUpdated: 1439478405547,
items: [42,500]
}
}
}
通过这种方式存储,post 42的详细信息只存在于一个位置,因此可以在一个位置编辑它们,并应用于可能存在的每个引用
当然,也可以使用对象引用来实现这一点,将相同的对象放在两个子项的数组中。然而,这与Redux并不特别兼容,在Redux中,状态改变返回新对象,而不是改变现有对象。使用规范化引用可以很好地处理不可变数据,这是Redux状态的一个优势