首页 > 其他分享 >immer 和useImmer两个库有啥区别

immer 和useImmer两个库有啥区别

时间:2024-03-24 20:13:45浏览次数:13  
标签:状态 name immer React useImmer 库有 draft

immer 和useImmer两个库有啥区别

immeruseImmer 是两个紧密相关的库,但它们在用途上有一定的区别:

immer:
immer 是一个 JavaScript 库,专注于提供一种简洁高效的不可变数据管理方式。它利用 Proxy 对象和 WeakMap 实现了所谓的“proxy-based immutability”,允许开发者以直观的可变方式操作数据,而实际上并不会改变原始数据,而是创建一个全新的、经过更新的不可变对象。这样既保证了数据的安全性(避免意外修改原始数据),又大大降低了编写纯函数式代码的复杂度。

import produce from 'immer';

let originalState = { users: [{ id: 1, name: 'Alice' }] };

let nextState = produce(originalState, draft => {
  draft.users.push({ id: 2, name: 'Bob' });
});

useImmer:
useImmer 是一个基于 immer 库实现的 React Hook。它专门为 React 应用程序设计,用于简化状态管理中的不可变数据更新。在React中,使用 useState 更新复杂的嵌套状态通常较为繁琐,而 useImmer 提供了一种简便的方式来创建可变代理对象,通过这个代理对象修改状态,React组件的状态就会自动更新,并且始终保持不可变原则。

import React from 'react';
import { useImmer } from 'use-immer';

function UserList() {
  const [users, updateUsers] = useImmer([{ id: 1, name: 'Alice' }]);

  function addUser(newUser) {
    updateUsers(draft => {
      draft.push(newUser);
    });
  }

  return (
    // 渲染用户列表...
    <button onClick={() => addUser({ id: 2, name: 'Bob' })}>Add User</button>
  );
}

总结:

  • immer 是底层库,提供了通用的不可变数据更新机制。
  • useImmer 是基于 immer 构建的 React Hook,专为在React组件内部实现状态管理时,以更符合直觉的方式进行不可变数据更新而设计。

那如果在react中直接使用immer该如何书写?
在React中直接使用immer进行状态管理,你可以结合React的useStateuseReducerHook来实现。以下是一个使用useState结合immer的基本示例:

import React, { useState } from 'react';
import produce from 'immer';

function ExampleComponent() {
  // 初始化状态
  const [state, setState] = useState({ users: [{ id: 1, name: 'Alice' }] });

  // 使用immer更新状态
  function addUser(newUser) {
    setState((prevState) =>
      produce(prevState, (draft) => {
        draft.users.push(newUser);
      })
    );
  }

  return (
    <div>
      {/* 渲染用户列表 */}
      {/* 添加用户按钮 */}
      <button onClick={() => addUser({ id: 2, name: 'Bob' })}>Add User</button>
    </div>
  );
}

export default ExampleComponent;

在上述示例中,我们首先导入了immer库的produce函数,然后在组件内部定义了初始状态并使用useState进行管理。
当需要更新状态时,我们不再直接修改状态对象,而是通过produce函数创建一个可变副本(draft),在draft上进行修改。
最后,immer会根据draft的修改情况返回一个新的状态对象,从而实现状态的不可变更新。

当然,如果你的应用程序有更复杂的状态管理需求,也可以结合useReducer Hook 使用immer来处理 reducer 中的状态更新逻辑。

标签:状态,name,immer,React,useImmer,库有,draft
From: https://www.cnblogs.com/longmo666/p/18092927

相关文章

  • CF1845F Swimmers in the Pool 题解
    思路考虑两个人什么时候会相遇。根据小学的相遇追及问题,两人会相遇的条件为:\[2\timesk\timesl=t\times(v1+v2)\]\[2\timesk\timesl=t\times(v1-v2)\]那么对于一个速度\(v\)。它可一相遇的次数即为:\[\frac{t\timesv}{2\timesl}\]当然,这样有可能会算重,也就是在相同......
  • css框架和组件库有什么区别
    Laravel是一个流行的PHP框架,它具有出色的可测试性,可以帮助开发人员在更短的时间内编写可靠的代码。但是,即使使用了这个框架,也可能会出现测试覆盖率较低的情况。测试覆盖率是指代码中已由测试案例覆盖的部分比例。测试覆盖率越高,代码质量越高。在本文中,我们将分享几种技巧,帮助您提......
  • [题解] CF632F - Swimmers in the Pool
    CF632F-SwimmersinthePool题目传送门题意给定一个大小为\(n\timesn\)的矩阵\(A\)。假设\(A\)满足以下条件,那么称该矩阵为MAGIC,否则为NOTMAGIC,并输出对应的属性(即\(A\)是MAGIC还是NOTMAGIC)。$A_{i,j}=A_{j,i}$;$A_{i,i}=0$;$A_{i,j}\le......
  • use-immer
    use-immer0.9.0 • Public • Published 6monthsago ReadmeCode Beta0Dependencies308Dependents26Versionsuse-immerAhooktouse immer asaReact hook tomanipulatestate.Installationnpminstallimmeruse-immerAPIuseImmeruseImmer......
  • immerjs:React开发必会技能
    immerjs:React开发必会技能龙骑士尹道长 ​关注 2人赞同了该文章我们都知道React追求的泛式是数据不可变,一般情况下state或者props改变才进入render阶段;如果我们创建的state是一个一般数据类型,他就是一个不可变的值,如果需要改变我们需要重新创建一个state......
  • 解决本地maven仓库有jar包却还要读取私服依赖的问题
    请打开你自己的本地仓库,对应依赖路径下的_remote.repositories文件。如果是从远程仓库拉取的,这里一般是显示这个:junit-4.12.jar>alimaven=junit-4.12.pom>alimaven=这个说明是从阿里云远程仓库拉取的代码由于这里的配置,使得你每次下载,他都会优先从阿里云远程仓库拉代码,而不是优先......
  • 时序数据库有哪些
    时序数据库全称为时间序列数据库。时间序列数据库指主要用于处理带时间标签(按照时间的顺序变化,即时间序列化)的数据,带时间标签的数据也称为时间序列数据。时间序列数据主要由电力行业、化工行业、气象行业、地理信息等各类型实时监测、检查与分析设备所采集、产生的数据,这些工业数据......
  • Vulnhub: ColddWorld: Immersion靶机
    kali:192.168.111.111靶机:192.168.111.183信息收集端口扫描nmap-A-sC-v-sV-T5-p---script=http-enum192.168.111.183查看login的源码发现提示:page和文件/var/carls.txt漏洞利用wfuzz探测account.php页面发现文件包含,参数为pagewfuzz-c-w/opt/zidian/SecLists......
  • 现在好用的数据库有哪几种?
    当谈到数据库时,有许多优秀的选择。以下是几个流行的数据库及其优点:1.MySQL:-优点:MySQL是一个开源的关系型数据库管理系统,具有易于使用、高性能、可靠性好的特点。它是在各种操作系统上广泛使用的,具有强大的数据处理能力,适用于中小型应用。2.PostgreSQL:-优点:PostgreS......
  • immer 使用场景举例·
    import{produce,enableES5}from'immer';1、if(data){this.setState(produce((draft)=>{draft.dataArry.push(data);draft.loading=false;}),);2、constructor(props:any......