为什么redux商店应该可序列化?

时间:2016-12-02 21:28:07

标签: javascript reactjs redux flux

在阅读redux文档时,我发现该文档提到了这一点:

  

但是,你应该尽力保持状态可序列化。   不要在里面放任何你不能轻易变成JSON的东西。

所以我的问题是,保持状态可序列化有什么好处? 或者,如果我将不可序列化的数据存入商店,我会遇到什么困难?

而且我相信这并不是redux-Flux所独有的,甚至React本地州也提出同样的建议。

让我明白这里是一个例子。假设商店结构是这样的。

{
    books: { 
        1: { id: 1, name: "Book 1", author_id: 4 }
    },
    authors: {
        4: { id: 4, name: "Author 4" }
    }
}

这一切看起来都不错。但是,当我尝试访问“第1册的作者”时,我必须编写如下代码:

let book = store.getState().books[book_id];
let author = store.getState().authors[book.author_id];

现在,我要定义一个类:

class Book {
    getAuthor() {
        return store.getState().authors[this.author_id];
    }
}

我的商店将是:

{
    books: {
        1: Book(id=1, name="Book 1")
    },
    ...
}

这样我就可以通过以下方式轻松获得作者:

let author = store.getState().books[book_id].getAuthor();

第二种方法可以使“书”对象知道如何检索作者数据,因此调用者不需要知道书籍和作者之间的关系。那么,为什么我们不使用它,而不是像方法#1那样在商店中保留“普通对象”?

任何想法都表示赞赏。

2 个答案:

答案 0 :(得分:15)

直接来自the redux FAQs

  

我可以在商店状态中添加功能,承诺或其他不可序列化的商品吗?

     

强烈建议您只将普通的可序列化对象,数组和基元放入商店。从技术上讲,可以将不可序列化的项目插入到商店中,但这样做会破坏保存和补充商店内容的能力,并且会干扰时间旅行调试。

     

如果您对持久性和时间旅行调试可能无法正常工作等问题感到满意,那么我们非常欢迎您将不可序列化的项目放入Redux商店。最终,它是您的应用程序,您如何实现它取决于您。与Redux的许多其他事情一样,请确保您了解所涉及的权衡。

进一步阅读:

答案 1 :(得分:0)

@timo的回答是正确的。此外,我建议使用名为Redux-ORM的库来处理Redux存储中的规范化/关系数据。请参阅我最近在Dealing with data consistency in a very large store in React + Redux SPA SaaS发表的评论,以获取更多信息的链接。