redux-toolkit createSlice 可以使用 js Map 作为状态吗?

2024-01-14

一般来说,使用可变对象,例如Map is 强烈劝阻 https://redux.js.org/faq/organizing-state#can-i-put-functions-promises-or-other-non-serializable-items-in-my-store-state.

然而,神奇的immer https://github.com/immerjs/immer允许对不可变对象进行操作,就像它们是可变的一样。

具体来说,immer 支持使用 Map 的不可变版本启用地图集 https://immerjs.github.io/immer/docs/map-set

在 redux 工具包中createReducer and createSlice用 immer 包装状态操作produce.

总的来说,我认为这些事实意味着这样的代码应该是安全的:

import { createSlice } from '@reduxjs/toolkit'

export const testmapSlice = createSlice({
  name: 'testMap',
  // Using a Map() as redux state
  initialState: new Map(),
  reducers: {
    add: (state, action) => {
      state.set(action.payload.identity, action.payload)
    },
  },
})

但是,当我在 React 组件中使用它时,我收到礼貌的错误消息A non-serializable value was detected in the state, in the path: `testMap`. Value: Map(1) {"A" => {…}} Take a look at the reducer(s) handling this action type: testMap/add..

有没有办法安全使用Map没有收到此错误消息?


定义“安全”:)

理论上,你could put anything你想要进入 Redux 商店。

实际上,根据该常见问题解答,不可序列化的值可能会导致 DevTools 之类的东西崩溃(这首先违背了使用 Redux 的大部分目的)。用于Maps 和其他可变实例也可能导致 UI 的某些部分无法正确重新渲染,因为 React-Redux 依赖引用检查来确定数据是否已更改。所以,we 具体来说告诉用户你永远不应该将不可序列化的值放入 Redux 状态 https://redux.js.org/style-guide/style-guide#do-not-put-non-serializable-values-in-state-or-actions.

在这种特殊情况下,您应该能够使用普通 JS 对象作为查找表而不是Map,并完成相同的行为。

作为绝对的最后手段,您可以关闭状态某些部分的序列化检查 https://redux-toolkit.js.org/api/serializabilityMiddleware,但我们强烈建议人们不要这样做。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

redux-toolkit createSlice 可以使用 js Map 作为状态吗? 的相关文章

随机推荐

  • 使用 txt 文件中的字符串填充数组

    Data txt 包含如下内容 猫 狗 老鼠 我想用该文件中的字符串填充一个数组 dico 0 Cat dico 1 Dog aso 我找到了这个 如何从 Swift 中调用 Objective C 的 NSArray 类方法 https
  • 我可以在提交 SQLite 事务后回滚该事务吗?

    SQLite 有没有办法在提交后基本上撤消最新事务 我想将数据库恢复到事务或保存点之前的状态 我查看了回滚命令 但看起来它仅限于回滚待处理的事务 Edit我可以创建一个名为 撤消 的保存点并等待在开始下一个操作之前释放它 或者在需要撤消它时
  • 单个查询中的 Wikipedia API 和 SPARQL

    我需要搜索其中包含一些特定单词的维基百科页面全文 为了改善结果 我想将结果限制为描述实体的页面的实例一个特定的实体 为了搜索全文 我可以使用 Wikipedia API 使用查询动作和搜索生成器 为了过滤给定实体的实例 我可以使用 Wiki
  • 如何检查包含路径下是否存在文件?

    您可以使用以下命令获取 PHP 中的当前包含路径get include path 我想知道检查是否可以包含该文件而不发出 PHP 错误的轻量级方法是什么 我正在使用 Yii 框架 我想要导入而不发出 PHP 错误 但我失败了 从 PHP 5
  • 如何避免以下代码中的Java.util.IllegalStateException?

    我有一个包含重复值的整数列表 我需要做的是找到重复的整数 添加它们的值 然后通过删除找到的重复项将结果添加到列表中 这是我正在做的事情 List
  • 如何设计从行创建动态列的查询

    我有数据 Table1 ID Name 1 n1 2 n2 3 n4 Table2 FID YearS Val 1 2008 Up 1 2009 Down 1 2010 Up 2 2000 Up 2 2001 Down 2 2002 Up
  • 如何在webview_flutter中设置Cookie?

    如何在初始化时在webview flutter中设置Cookie body WebView initialUrl index url javascriptMode JavascriptMode unrestricted onWebViewC
  • 将 CoffeeScript 与 Eclipse 集成?

    有没有一种方法可以集成 CoffeeScript 和 Eclipse 以便当我在一个窗口中编写 CoffeeScript 时 另一个窗口会将编译后的代码显示为 Javascript 我会等待答案 谢谢 我已经在我的项目中使用构建器和小型 s
  • 图像权限(不希望它们出现在图库中)

    我正在开发一个将图像存储在 Android data 文件夹中的应用程序 这些图片在画廊中可见 但我不想要这样 是否可以设置文件夹的权限 以便它们只能由应用程序本身使用 或者我应该将它们存储在另一个文件夹中 创建一个名为 nomedia在文
  • 我可以将 LESS 与 Xul 一起使用吗?

    我可以用吗LESS http lesscss org 与徐尔 有人已经一起使用过它们吗 我还没见过有人使用它 但没有什么能阻止你尝试 LESS 只是一个预处理器 它输出 CSS 文件 因此您可能会发现的问题应该与您可能需要使用的 Mozil
  • 当字符串包含多个双引号时,从字符串中提取 URL 的正则表达式失败?

    我正在使用正则表达式从字符串中提取 url 它大部分工作正常 var regex new Regex a href a
  • 在 android 中从 Shoutcast Url 播放

    我正在开发一个需要播放 Shoutcast 广播的应用程序 对于API我已经遵循了这个URL http wiki winamp com wiki SHOUTcast Radio Directory API 我成功地使用我的开发者 ID 获取
  • 在 CUDA 中使用 SIMD 实现位旋转运算符

    我知道 StackOverflow 不是用来向其他人询问代码的 但让我说一下 我正在尝试在 CUDA C 设备代码中实现一些 AES 函数 在尝试实现左字节旋转运算符时 我很不安地发现没有原生 SIMD 内在功能 所以我开始了一个幼稚的实现
  • 会计和数据库设计,存储借方和贷方金额

    问题 在下面的情况下 我是否应该将所有金额存储为正小数金额 然后将该金额标记为 借方 或 贷方 而不是将借方存储为负金额 将贷方存储为正金额 在我的数据库设计中 我将 借方 存储为负金额 将贷方存储为正金额 现在 在报告中有时结果会出错 因
  • 附件动作序列(UITableViewController)

    我正在尝试通过 IB 进行 segue 当按下 tableView 中的单元格附件时切换视图 来自我的IB的图片 1 我从 tableviewcontroller 的单元格拖动到另一个视图并选择 Accessory Action gt Pu
  • 如何使用 InvokeCommandAction 调用我的方法并传入参数?

    我一直在试图弄清楚如何从Loaded 事件 我在这里问了一个问题 我将如何在 Loaded 上传递参数 https stackoverflow com questions 30488770 how would i go about pass
  • 如何通过代码判断iPad是黑色还是白色? [复制]

    这个问题在这里已经有答案了 我想知道是否有办法通过代码判断 iPad 是黑色还是白色 简单的谷歌搜索没有发现任何结果 iPhone 上的序列号为您提供了所有这些信息 您只需将颜色代码映射到颜色本身即可 iPhone SN 的典型格式如下 A
  • UIButton 将点击和滚动手势传递给 UIScrollView

    我有一个水平分页的UIScrollView with a UIButton部分覆盖滚动视图 像这样 UIView UIScrollView UIButton 我想做UIButton不触发点击按钮上方滚动并释放 我想要UIScrollView
  • Python(TKinter)中形状的随机填充颜色

    我想知道如何从列表中获取随机颜色以在draw rectangle colors red orange yellow green blue violet canvas create rectangle self x self y self x
  • redux-toolkit createSlice 可以使用 js Map 作为状态吗?

    一般来说 使用可变对象 例如Map is 强烈劝阻 https redux js org faq organizing state can i put functions promises or other non serializable