Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Redux->Reducer是如何使用一个扩展操作符(它只是一个浅拷贝)来实现状态不可变的深度克隆的?

Redux->Reducer是如何使用一个扩展操作符(它只是一个浅拷贝)来实现状态不可变的深度克隆的?
EN

Stack Overflow用户
提问于 2022-09-20 09:41:07
回答 1查看 69关注 0票数 1

我在学习Redux。但是,我知道还原器是一个接收当前状态和动作对象的函数,然后决定如何更新状态、复制状态、更新深度复制的状态并最终返回新状态。

因此,下面的代码就是一个典型的例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const initialState = { value: 0 }

function counterReducer(state = initialState, action) {   // Check to see if the reducer cares about this action   if (action.type === 'counter/increment') {
    // If so, make a copy of `state`
    return {
      ...state,
      // and update the copy with the new value
      value: state.value + 1
    }   }   // otherwise return the existing state unchanged   return state }

但是,您会意识到,它正在使用spread操作符来复制状态。spread操作符只对它做了一个浅拷贝。因此,这意味着状态不应该是多维对象?

因为,据我所知,扩展运算符不适用于多维数组或对象。如果它是多维的,则通过引用而不是按值复制值。这就是如果您真的想要对对象或数组进行深度复制的原因,您可以使用Lodash库、structuredClone甚至JSON.parse(JSON.stringify(此处为“您的对象/数组”)。

那么,有人知道如果这个存储只是Redux中的一个级别的对象存储吗?那么在本例中,使用操作符没有任何问题。或它是一种扩展运算符表示,实习生Redux对它进行了深入的克隆?。

--谢谢你!!

干杯,海龟们

EN

回答 1

Stack Overflow用户

发布于 2022-09-21 03:12:04

事实上,答案是,如果你有一个状态多维,你必须写你的减速器这样的工作:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function handwrittenReducer(state, action) {
  return {
    ...state,
    first: {
      ...state.first,
      second: {
        ...state.first.second,
        [action.someId]: {
          ...state.first.second[action.someId],
          fourth: action.someValue
        }
      }
    }
  }
}

然而,现在我们使用的是Redux的createSlice函数,因此createSlice使用了一个名为Immer的库。

"Immer“使用一种名为Proxy的特殊JS工具来包装您提供的数据,并允许您编写”变异“包装数据的代码。但是,Immer跟踪您试图进行的所有更改,然后使用该更改列表返回一个安全更新的值,就像您手动编写了所有不可变的更新逻辑一样。”

因此,上述代码可以简化为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function reducerWithImmer(state, action) {
  state.first.second[action.someId].fourth = action.someValue
}

记住:

“您只能在Redux的createReducer

createSlice和createSlice中编写”“逻辑,因为它们在内部使用Immer!如果您在没有Immer的还原器中编写变异逻辑,它会变异状态并导致错误!”

干杯,海龟们

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73790705

复制
相关文章
python 列表有没有顺序_python的list顺序详解
Python内置的一种数据类型是列表:list。list是一种有序的集合,可以随时添加和删除其中的元素。
IT工作者
2022/08/04
1.3K0
LeetCode 1389. 按既定顺序创建目标数组
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/create-target-array-in-the-given-order 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
Michael阿明
2022/11/26
4220
LeetCode 1389. 按既定顺序创建目标数组
LeetCode 1389. 按既定顺序创建目标数组
目标数组 target 最初为空。 按从左到右的顺序依次读取 nums[i] 和 index[i],在 target 数组中的下标 index[i] 处插入值 nums[i] 。 重复上一步,直到在 nums 和 index 中都没有要读取的元素。 请你返回目标数组。
freesan44
2020/06/16
4620
LeetCode 1389. 按既定顺序创建目标数组
1389. 按既定顺序创建目标数组: https://leetcode-cn.com/problems/create-target-array-in-the-given-order/
村雨遥
2020/04/07
6420
Python创建数字列表
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 10 1 sum is : 55
py3study
2020/01/03
1.3K0
Python按顺序读取文件夹中文件
涉及到文件操作,我们有时候会读取一个文件夹中的所有的文件。这些文件可能是文件名完全混乱的,也可能是完全格式化的(如1.png,2.png...)。下面介绍Python中的几种按顺序(假如有)读取文件夹中文件的方法。
狼啸风云
2020/08/27
9.9K0
Python按顺序读取文件夹中文件
junit方法按顺序执行
选定版本,直接加注解
IT云清
2021/12/06
1.3K0
junit方法按顺序执行
sql按顺序去重
参考博客: https://blog.csdn.net/qtvb1987/article/details/42081585
周杰伦本人
2022/10/25
8450
sql按顺序去重
数组按指定顺序排序
数组排序可以直接使用 sort() 方法,可以对数组按规律排序。 但如果指定一个没有规律的顺序进行排序呢? 同样可以使用  sort() 方法: const data = [   { name: '张三', code: 'zs' },   { name: '王五', code: 'ww' },   { name: '赵七', code: 'zq' }, ]; data.sort((star, next) => {   const sortList = ['zq', 'zs', 'ww']   return 
德顺
2022/06/12
2.7K0
[LTE] CSG(Closed Subscriber Group)闭合用户组
CSG是3GPP R8中引入的概念,定义为闭合用户组。有以下特点: 每个CSG由一个CSG ID标识 同一用户可属于多个CSG,用户与CSG的关系就好比签约,启用了CSG小区只会允许签约用于接入 UE维护一张它所属CSG的CSG ID列表,在这个列表之外的其他CSG ID所对应的CSG小区对该UE而言是不可访问的。 每个CSG小区广播一个CSG ID,这个CSG ID所标识的闭合用户群的成员可以访问该小区 CSG模式需要终端和核心网的支持,在R8之前的终端和核心网都无法使用CSG功能。
轻舞飞扬SR
2021/02/24
1K0
python 按顺序读文件夹下面的文件
方法一: import os path="/home/test/" #待读取的文件夹 path_list=os.listdir(path) path_list.sort() #对读取的路径进行排
狼啸风云
2020/08/10
2.5K0
python 按顺序读文件夹下面的文件
python中按字母排序_在Python中按字母顺序排序文本文件的内容
我想在文件内部按字母顺序排序。我当前执行此操作的代码不起作用,文件保持不变。这个程序本身就是一个基本的调查问卷,用来实验读写文件。在import time
用户7886150
2021/01/27
4.9K0
【代码】Python多线程执行并且按原本顺序返回[详细注释]
简单记录一下,免得下次找不到,还得重写。 先看一下效果,然后直接上代码,并且每行都配注释。 # 导入线程池的包 from concurrent.futures import ThreadPoolExecutor, as_completed # 整个的任务函数,方便调用。也可以拆开写 def extract_append_audio_features(extract_type='age', max_workers=16): # feature_csv任务队列,可以理解为数组 data
小锋学长生活大爆炸
2023/03/01
1.9K0
【代码】Python多线程执行并且按原本顺序返回[详细注释]
列表:创建列表
列表是Tcl语言中最重要的一种数据结构。什么是列表?列表是元素的有序集合,各个元素可以包含任何字符串,例如空格,反斜杠,换行符等。列表表现为特定结构的字符串,这意味着可以把它们赋值给一个变量,可以把它们做为参数传给命令,可以把它们嵌套到其他列表中。
Lauren的FPGA
2019/10/30
2.4K0
实现线程按顺序输出ABC
线程按顺序输出ABC 实现描述:建立三个线程A、B、C,分别按照顺序输出十次ABC 首先建立一个方法,按照条件进行输出 class PrintABC{ private int index=0; public synchronized void print(int n) { // TODO Auto-generated method stub try { while(index!=n) { wait(); } if(index==0) { System.out.
呆呆
2021/10/06
7810
python中创建列表的方法_python中readlines
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/184390.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/27
3.8K0
使用Python按另一个列表对子列表进行分组
在 Python 中,我们可以使用各种方法按另一个列表对子列表进行分组,例如使用字典和使用 itertools.groupby() 函数,使用嵌套列表推导。在分析大型数据集和数据分类时,按另一个列表对子列表进行分组非常有用。它还用于文本分析和自然语言处理。在本文中,我们将探讨在 Python 中按另一个列表对子列表进行分组的不同方法,并了解它们的实现。
很酷的站长
2023/08/11
4530
使用Python按另一个列表对子列表进行分组
Python集合用处
一些集合的最基本操作,如集合取交集、取并集、取差集、判断一个集合是不是另一个集合子集或者父集等。
马修
2021/01/21
5650
使用 Python 创建使用 for 循环的元组列表
Python 的关键数据结构是列表和元组。元组元素一旦设置,就无法更改。这称为不可变性。但是列表元素可以在初始化后修改。在处理需要组合在一起的数据时,for 循环用于创建元组列表。列表比元组更具适应性,因为它们能够被修改。本教程演示如何使用 for 循环创建元组列表,从而简化重复性任务。
很酷的站长
2023/08/11
3830
使用 Python 创建使用 for 循环的元组列表
【说站】python列表的创建和存放
列表中可存放各种类型的要素,包括int、float等基本类型,也包括dict、str等标准类型。
很酷的站长
2022/11/23
1.1K0
【说站】python列表的创建和存放

相似问题

python熊猫按值创建列表组

10

按地形顺序创建资源组

12

用迭代工具按三个列表组成Python组

30

按特定顺序/顺序合并python列表

21

按数字顺序创建列表

13
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文