Javascript 非规范化数据如何在react redux中引起问题?

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

看着redux的reddit文档,Dan说:

{
  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状态的一个优势