如何在规范化状态下使用结果数组按排序顺序呈现帖子

时间:2018-08-29 16:14:26

标签: reactjs normalizr

我已经在我的react应用程序中成功使用normalizr来规范我的API响应。在我的状态下,我有实体和结果数组。我正在使用实体在我的react组件中渲染帖子,但是它们不是按其原始顺序排列的。

我知道实体是一个对象,因此它不会维持顺序。我也理解我必须使用结果数组,因为它具有原始顺序的ID。我的问题是如何在我的react组件中使用此结果数组按原始顺序显示帖子?

我已经搜索了Google+堆栈,但似乎找不到解决我问题的具体答案。在映射渲染器中的实体对象之前,我还尝试过进行如下排序:

Object.values(posts).sort((a, b) => a.created_on > b.created_on)

Object.values(posts).sort((a, b) => a.created_on + b.created_on)

Object.values(posts).sort((a, b) => a.created_on - b.created_on)

,然后使用地图。但是所有这些都不起作用。

是否有不使用denormalizr的特定方法?

谢谢。

3 个答案:

答案 0 :(得分:0)

也许您没有正确调用排序?这似乎可行:

const sorter = (a, b) => {
  return a < b;
}

let posts = [4, 5, 7, 1]
posts.sort(sorter).map(i => console.log(i))

答案 1 :(得分:0)

我们可能需要更多信息,因为我认为它应该起作用。以下函数对数组进行排序,并在react render return语句内按升序进行渲染。

{array.sort((a, b) => a.created_on > b.created_on).map((item) => {
      return (
        <div>{item.name}</div>
      )
}}

通过说这是行不通的,您是说帖子是通过地图呈现的但未排序?帖子根本不显示?我没有使用过normalizr,但是如果normalizr返回一个数组并且您正在对该数组执行排序,那么我认为问题可能出在其他地方。

答案 2 :(得分:0)

非常感谢。但是...

我刚刚发现我的渲染中不需要排序方法,因为我使用的是normalizr,其已经具有按正确顺序排列的所有帖子的结果数组它们的ID,而显然所有发布数据都在entity对象中。

因此,我设法遍历了normalizr结果数组,该数组保存每个帖子的所有键ID,然后按其各自的键ID返回实体对象中的每个帖子。

就这样...

resultArray.map(post => postEntities[post]);

因为我正在通过已排序的结果数组进行映射,所以这将按正确的顺序获取所有帖子。

顺便说一句,我正在为此使用选择器。因此,上面的代码不在render组件中,而是在selectors.js