【问题标题】:Why is a Map in JS considered non serializable in redux?为什么 JS 中的 Map 在 redux 中被认为是不可序列化的?
【发布时间】:2021-08-18 04:13:07
【问题描述】:

使用 redux 并尝试将地图存储到其中时,会出现错误:

在状态中检测到不可序列化的值

这是为什么呢?我知道医生说你不能,但它没有解释为什么。因为你不能直接 JSON.stringify 一个地图?但是你可以做这样的事情......

m = new Map()
m.set("1", "2")
JSON.stringify([...m]);

【问题讨论】:

  • "因为您不能直接 JSON.stringify 地图?" 正确。 “但是你可以做这样的事情......”你只是在展示你如何不是序列化一个映射,而是一个键值对数组。跨度>
  • “为什么项目 X 做出决定 Y”问题通常不适合 Stack Overflow。
  • @T.J.Crowder 我们实际上有一个问答Why redux store should be serializable? - 答案只是文档中的引用。这个问题是在问为什么地图不可序列化并且......老实说,我不能比“因为它不是”更有意义地回答它。这也已包含在问题中。
  • 任何附加了方法的对象都是不可序列化的。当然,任何对象都可以实现自己的系统来与 JSON 进行转换,但 Redux 不会意识到这种转换。

标签: javascript reactjs redux


【解决方案1】:

一个地图可以在特定情况下被序列化和反序列化如果你手动提供逻辑,使用map.entries()Map.fromEntries(...)。 p>

假设映射的所有键和值本身都是可序列化的 - 不一定是这种情况,因为映射可以将任何对象作为键(当然还有值)。

它不能通过调用JSON.serialize 自动序列化,而这种方式允许您通过调用JSON.parse 来重建它 - 这是大多数工具所依赖的。

因此,使用 Map 可能会破坏像 redux-persist 这样的中间件(除非您在其中添加更多逻辑)和无数其他的,有时甚至(取决于您在此处输入的内容以及用作键的内容)甚至会破坏让你的 DevTools 崩溃。

由于仅包含可序列化的值和键的映射与仅出于相同目的使用普通对象相比没有真正的好处,因此我们建议仅使用纯 JavaScript 对象而不是映射。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-23
    • 2017-04-17
    • 1970-01-01
    • 2015-04-22
    • 2013-08-01
    • 1970-01-01
    • 2022-12-22
    • 2012-12-05
    相关资源
    最近更新 更多