非标准化数据如何在react redux中引起问题?

时间:2016-08-20 02:27:06

标签: javascript reactjs redux normalization react-redux

看看redux的reddit doc example,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在状态树的几个地方重复。这将是   实施真的很痛苦。

有人可以解释他所指的分页信息是什么吗?如果用户想要编辑提取的帖子,它会是什么样子?这是如何导致帖子在状态树中的多个位置重复的?

1 个答案:

答案 0 :(得分:1)

我相信lastUpdated属性是他引用的分页数据;可以使用它(取决于API)来提取自上次更新以来所做的更改。

关于规范化的困惑是可以理解的,因为他没有包含非规范化方法不好的案例 - 尽管在文档的下一段中,他确实提供了一个例子。标准化结构看起来就像是需要它的情况。

但请考虑这种情况:我们仍然在管理跟踪帖子的数据集'这些是' subreddits'的一部分。但是现在我们允许单个帖子被交叉发布的可能性,并且我们将表示相同的单个帖子包含在每个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'下更新SAME帖子的标题,但是如果没有完全搜索我们的州,我们无法知道这一点。因此,我们要么进行代价高昂的搜索,要么我们要引入数据完整性问题。

标准化,此状态看起来像:

{
  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]
    }
  }
}

以这种方式存储,帖子42的细节只存在于一个地方,因此可以在一个地方编辑它们并应用于可能存在的每个参考文献。

当然,也可以使用对象引用来完成此操作,将同一个对象放在两个subreddits的数组上。然而,这与Redux并不特别相容,其中状态改变返回新对象而不是改变现有对象。使用规范化引用可以很好地处理不可变数据,这对Redux状态来说是一个优势。