Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么redux存储应该是可序列化的?_Javascript_Reactjs_Redux_Flux - Fatal编程技术网

Javascript 为什么redux存储应该是可序列化的?

Javascript 为什么redux存储应该是可序列化的?,javascript,reactjs,redux,flux,Javascript,Reactjs,Redux,Flux,阅读redux文档时,我发现该文档提到: 不过,您应该尽最大努力保持状态可序列化。 不要在里面放任何你不能轻易转换成JSON的东西 所以我的问题是,保持状态可序列化有什么好处? 或者,如果我将不可序列化的数据放入存储中,可能会遇到什么困难 我相信这并不是redux独有的——Flux,甚至是地方政府建议的 让我明确一点,这是一个例子。假设存储结构是这样的 { books: { 1: { id: 1, name: "Book 1", author_id: 4 }

阅读redux文档时,我发现该文档提到:

不过,您应该尽最大努力保持状态可序列化。 不要在里面放任何你不能轻易转换成JSON的东西

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

我相信这并不是redux独有的——Flux,甚至是地方政府建议的


让我明确一点,这是一个例子。假设存储结构是这样的

{
    books: { 
        1: { id: 1, name: "Book 1", author_id: 4 }
    },
    authors: {
        4: { id: 4, name: "Author 4" }
    }
}
这一切看起来都不错。然而,当我试图访问“第一本书的作者”时,我必须编写如下代码:

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();
第二种方法可以使“book”对象知道如何检索作者数据,因此调用方不需要知道book和作者之间的关系。那么,为什么我们不使用它,而不是像方法1一样在存储中保留“普通对象”

欢迎您提出任何想法。

直接从:

我可以将函数、承诺或其他不可序列化项置于我的存储状态吗?

强烈建议您只将普通的可序列化对象、数组和原语放入存储中。从技术上讲,可以向存储中插入不可序列化的项,但这样做会破坏存储内容的持久化和再水化能力,并干扰时间旅行调试

如果您对持久性和时间旅行调试等可能无法正常工作的事情没有意见,那么完全欢迎您将不可序列化的项放入Redux存储中。最终,它是您的应用程序,如何实现它取决于您。正如关于Redux的许多其他事情一样,只需确保您了解所涉及的权衡


进一步阅读:


再加上@Timo所说的,如果您想在状态树中设置两个状态之间的关系并使用计算值,
重新选择
最适合该场景。它允许创建可用于定义计算状态的选择器。在您的情况下,可以使用
书籍
顶部的选择器创建
作者

@timo的答案是正确的。此外,我建议使用一个名为的库来处理Redux存储中的规范化/关系数据。有关更多信息的链接,请参见我最近的评论。

在JS中,您可以进行一般调用/应用调用,因此这样的DEF不需要存在于数据中,并且应该将数据和逻辑分开。如果你想要方便、有条不紊的好东西,就再做一个抽象层吧。谢谢你的回答,特别是提到时间旅行。这对我来说是新的,保持商店的可序列化是有意义的。作为Redux FAQ的作者,这正是我写它的原因:)很高兴看到人们引用它并使用它来帮助回答问题@markerikson你在他们身上做得很好,特别是收集到问题和第三方资源的链接真的很有帮助!