在 Redux 存储中存储不可序列化数据项的实际风险是什么?

cbd*_*per 6 javascript serialization redux redux-devtools redux-toolkit

每当我在 Redux 存储中存储不可序列化的值时,我都会收到以下警告:

在下面的示例中,我存储了Firestore.TimestampRedux 状态。它也发生在Date物体上。

在状态中检测到不可序列化的值,路径为:blogPost.createdAt。值:t {秒:1583488258,纳秒:805000000}

看一下处理此操作类型的减速器:LOAD_BLOGPOST_SUCCESS。(参见https://redux.js.org/faq/organizing-state#can-i-put-functions-promises-or-other-non-serialized-items-in-my-store-state

这就是医生的说法:

https://redux.js.org/faq/organizing-state#can-i-put-functions-promises-or-other-non-serializing-items-in-my-store-state

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

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

如果您对持久性和时间旅行调试等可能无法按预期工作的事情感到满意,那么完全欢迎您将不可序列化的项目放入 Redux 存储中。最终,这是您的应用程序,如何实现它取决于您。与 Redux 的许多其他事情一样,只要确保您了解其中涉及的权衡即可。

我从上面的文档摘录中不太明白。我认为这有点模糊。有人能更详细地解释一下,通过向 Redux 状态添加不可序列化的数据,我们到底可能/将会损失什么吗?

不同数据类型的结果是否不同?例如: a Promise、 afunction (ex: a React component)和 aDate会导致不同的问题吗?肯定会带来问题吗?或者它是可能发生或可能不会发生的事情吗?

保存和补充商店内容的能力意味着什么?这是否意味着它可能会破坏我的应用程序的代码,或者我们只讨论开发工具调试?


更新

刚刚从 Redux Toolkit 中找到了另一篇文档:使用不可序列化数据

处理不可序列化的数据

Redux 的核心使用原则之一是不应将不可序列化的值放入状态或操作中。

然而,像大多数规则一样,也有例外。有时您可能必须处理需要接受不可序列化数据的操作。应该很少这样做,并且仅在必要时才这样做,并且这些不可序列化的有效负载不应该通过减速器进入您的应用程序状态。

可序列化开发检查中间件会在检测到操作或状态中的不可序列化值时自动发出警告。我们鼓励您保持此中间件处于活动状态,以帮助避免意外犯错误。但是,如果您确实需要关闭这些警告,则可以通过将其配置为忽略特定操作类型或操作和状态中的字段来自定义中间件:

看来本节教您如何忽略在操作中使用不可序列化值的警告,但它也说它不应该进入状态,对吧?

小智 2

保存和补充商店内容的能力意味着什么?这是否意味着它可能会破坏我的应用程序的代码,或者我们只讨论开发工具调试?

可序列化数据,意味着将数据转换为文本表示,然后将其从文本表示重新加载为实际类型;

保存和补充储存内容物的能力意味着

保留和补充应用程序是一种用于存储当前应用程序商店状态以便稍后重新加载的技术。假设您的用户正在处理一些复杂的表单,当他关闭浏览器并重新打开它时,您希望表单填充用户在上次会话中输入的内容,但不将数据存储在后端服务器中。因此,当网页关闭时,您会保留您的反应存储,并在用户重新打开网页时重新加载它(从本地存储重新水合)

实际发生的情况是,当您想要从之前保存的数据中提取应用程序状态时,不可序列化的字段将不会被解析并转换为正确的类型(即使不可序列化,有时也可能会起作用)

因此,如果您不打算持久化和补充状态,则可以忽略该消息,但您也可以为您的类型实现自定义序列化程序(例如,将时间戳转换为字符串)