首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >immer:优雅操作react数据状态,告别繁琐克隆拷贝

immer:优雅操作react数据状态,告别繁琐克隆拷贝

作者头像
程序员王天
发布于 2023-10-18 11:34:47
发布于 2023-10-18 11:34:47
1.4K00
代码可运行
举报
运行总次数:0
代码可运行

# 前言

Immer 是一个用于简化 JavaScript 状态管理的库,以更方便地更新和操作不可变数据

可以解决以下问题:

  1. 不可变状态更新:React 推崇使用不可变(Immutable)的数据来管理组件的状态。 :::tips 【Immutable 不可变对象】 不直接修改状态或属性对象,而是创建新的对象来代表改变后的状态。 :::

Immer 使得在 React 中使用不可变数据更加容易,通过提供简洁的 API 和直观的语法,以可变的方式更新不可变数据。

  1. 状态更新的简洁性:React 的传统方式是通过使用 setState 方法更新状态,需要手动创建新的状态对象或数组,并进行深度克隆。而使用 Immer,可以通过直接在原始状态上进行修改,以一种可变的方式更新状态。

React 中使用 Immer ,可以避免手动编写深度克隆、合并对象或数组的代码,同时还能保持数据的不可变性,方便进行状态管理和追踪变更。

# react 组件使用 immer

以下是一个使用 Immer 的 React 组件示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import React from "react";
import { produce } from "immer";

class Counter extends React.Component {
  state = {
    count: 0,
  };

  increment = () => {
    this.setState(
      produce((draft) => {
        draft.count += 1;
      })
    );
  };

  render() {
    return (
      <div>
        <p>Count: {this.state.count}</p>
        <button onClick={this.increment}>Increment</button>
      </div>
    );
  }
}

export default Counter;

在上面的示例中,我们使用 produce 函数将状态更新的逻辑放在一个回调函数中,然后将回调函数传递给 setState。Immer 会在回调函数中提供一个名为 draft 的草稿对象,

我们可以直接对该对象进行更改,而不用担心原始对象被修改。Immer 会根据我们的更改生成一个新的不可变对象,并将其作为新的状态进行更新。

# redux 中使用 immer

接下来,让我们看一个使用 Immer 结合 Redux 的示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { createStore } from "redux";
import produce from "immer";

// 初始状态
const initialState = {
  count: 0,
};

// reducer
const reducer = (state = initialState, action) => {
  return produce(state, (draft) => {
    switch (action.type) {
      case "INCREMENT":
        draft.count += 1;
        break;
      case "DECREMENT":
        draft.count -= 1;
        break;
      default:
        break;
    }
  });
};

// 创建 store
const store = createStore(reducer);

export default store;

在上面的示例中,我们在 Redux 的 reducer 中使用 produce 函数来更改状态。它接收当前状态 state 和表示要进行的更改操作的回调函数。我们可以在回调函数中对 draft 对象进行更改,Immer 会自动处理状态的更新。

# 总结

在使用 React 组件时,可以使用 produce 函数来更新状态,而在使用 Redux 时,可以在 reducer 中使用 produce 函数来进行状态更改操作。这样可以避免手动编写不必要的克隆和合并代码,并且使我们的代码更容易理解和维护。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023年9月30日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
斯坦福大学密码学-使用分组密码 04
可以设计出攻击者A,询问 x=0和 x=1,因为PRP中没有f(0)=f(1)的情况,所以当f(0)=f(1)时,一定是实验1,所以输出1,否则,输出0。所以实验0 PRP没有f(0)=f(1)的情况,所以输出1的概率为0,而实验1输出1的概率为1/2。
Daffy
2020/11/03
1.4K0
斯坦福大学密码学-零碎 08
CTX:上下文字符串,是一个唯一的字符串,作为应用的身份。在一个系统中可能有多个应用。多个应用试着建立多个安全密钥。CTX试图将它们区分。
Daffy
2020/11/05
1.4K0
斯坦福大学密码学-基于Diffie-Hellman 的公钥加密 12
Bob用Alice的公钥加密完 后,Alice就可以用自己的私钥解出对称密钥,读取文件。
Daffy
2020/11/07
1.3K0
斯坦福大学密码学-基于陷门置换的公钥加密 11
注意:G在现实中有一个参数,叫安全参数,指定了这个密钥生成算法将要生成的密钥大小。
Daffy
2020/11/07
2.7K0
斯坦福大学密码学-分组密码 03
典型的分组密码以迭代的形式构建。输入密钥k,然后将密钥扩张成一系列的回合密钥 到 。使用这些回合密钥一次又一次的迭代使用回合函数加密明文信息。
Daffy
2020/11/03
2K0
斯坦福大学密码学-认证加密 07
如果目标端口是25,TCP/IP栈会解密这个包,看目标端口,然后把明文数据发给目标进程。
Daffy
2020/11/04
2.3K0
斯坦福大学密码学-抗碰撞 06
基于CBC的MAC:两种变形:ECBC,CMAC。常与AES一起使用,在802.11i标准里,CBC-MAC被用于信息完整性。
Daffy
2020/11/04
2K0
斯坦福大学密码学-信息完整性 05
目标:只提供完整性,不提供私密性。举例:硬盘上的公共信息,不在乎私密性,只在乎是否被病毒入侵,被篡改。广告商。
Daffy
2020/11/03
1.5K0
斯坦福大学密码学-绪论 01
争取这周看完斯坦福大学Dan Boneh 教授的密码学课程,fighting !!!
Daffy
2020/11/02
1.1K0
简述分组密码的加密分组链接模式的工作原理及其特点(密码学移位密码加密解密)
常用的分组加密模式有四种,分别是:电子密码本模式 (ECB)、加密分组链接模式 (CBC)、加密反馈模式 (CFB)和输出反馈模式 (OFB)。下面重点介绍这四种加密模式, 对其他的加密模式仅作简单的概括。
全栈程序员站长
2022/07/28
2.7K0
简述分组密码的加密分组链接模式的工作原理及其特点(密码学移位密码加密解密)
密码学技术02
一次性密码本是一种非常简单的密码,它原理是:“讲明文与一串随机的比特序列进行XOR运算”
yichen
2020/01/02
7930
读《图解密码技术》(一):密码
以前,对一些密码技术,虽然懂得怎么用,但对其原理却一直不甚了解,比如,用公钥加密后,为什么用私钥就可以解密?DES和AES加密时为什么需要一个初始化向量?想要了解这些密码技术的基本原理,而最近买书时看到了《图解密码技术》这本书,刚好可以解答到我的这些问题,于是,就买回来看了。
Keegan小钢
2018/08/10
3.4K1
读《图解密码技术》(一):密码
斯坦福大学密码学-密钥交换 09
没有可信第三方的密钥交换,可以用对称加密实现吗? 可以滴!!!但是效率很低,实际中没有用。
Daffy
2020/11/05
9910
《计算机系统与网络安全》 第四章 密码学基础
首先来看密码学概述。什么是密码学密码学的英文单词?Cryptology来自于两个希腊文单词,一个是accepts,一个是logos。分别的意思是隐藏信息,所以密码学主要就是用来隐藏信息的。密码学分为两个分支,photography、密码学、密码加密学,另外一个分支就是crypto analysis,密码分析学。
猫头虎
2024/04/08
3140
《计算机系统与网络安全》 第四章 密码学基础
古典密码学概述
隐写术是指首先用传统加密算法对数据进行加密,然后用某种方法将加密后的数据修改为一个伪装文本。
hotarugali
2022/03/01
2K0
古典密码学概述
密码学技术03
在之前讨论的 DES、AES 都属于分组密码,他们只能加固固定长度的明文。如果要加密任意长度的明文,就需要对分组密码进行迭代,迭代的方法称为模式。
yichen
2020/01/02
6260
密码学知识总结
  很喜欢这种开放性题目的作业,每个人可以根据自己的兴趣来选择相应的题目。也是一个锻炼自主学习能力的机会。   学习密码学用图片可以很难直观地展现算法的流程,推荐一本书《图解密码技术》,书中有大量的图片,可以用来入门。
yifei_
2022/11/14
7240
《深入浅出密码学》——读书笔记(更新中)
h1 { text-align: center } h2 { text-align: center } .picture { text-align: center } thead th, tfoot th { text-align: left; background: grey; color: white } tbody th { text-align: left; background: Gainsboro; color:white }
Homqyy
2023/03/06
1K0
《深入浅出密码学》——读书笔记(更新中)
简单小结密码学入门知识点
  密码,最初的目的是用于对信息加密,计算机领域的密码技术种类繁多。但随着密码学的运用,密码还被用于身份认证、防止否认等功能上。密码是通信双方按约定的法则进行信息特殊变换的一种重要保密手段。依照这些法则,变明文为密文,称为加密变换;变密文为明文,称为脱密变换。密码在早期仅对文字或数码进行加、脱密变换,随着通信技术的发展,对语音、图像、数据等都可实施加、脱密变换。
步履不停凡
2019/08/23
2.4K0
简单小结密码学入门知识点
【密码学】为什么不推荐在对称加密中使用CBC工作模式
这篇文章是我在公司内部分享中一部分内容的详细版本,如标题所言,我会通过文字、代码示例、带你完整的搞懂为什么我们不建议你使用cbc加密模式,用了会导致什么安全问题,即使一定要用需要注意哪些方面的内容。
9eek
2023/05/23
3.4K1
【密码学】为什么不推荐在对称加密中使用CBC工作模式
相关推荐
斯坦福大学密码学-使用分组密码 04
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档