Immer编写更简单的逻辑

devtools/2024/12/22 21:51:36/

Immer

当我们在更新一个复杂的嵌套对象时:

const [person, setPerson] = useState({name: 'Niki de Saint Phalle',artwork: {title: 'Blue Nana',city: 'Hamburg',    image: 'https://i.imgur.com/Sd1AgUOm.jpg',}
});

如果想要更新person.artwork.city的值,可以使用函数调用:

setPerson({...person, // 复制其它字段的数据 artwork: { // 替换 artwork 字段 ...person.artwork, // 复制之前 person.artwork 中的数据city: 'New Delhi'  // 将 city 的值替换为 New Delhi!}
});

使用 Immer 编写简洁的更新逻辑

如果你的 state 有多层的嵌套,你或许应该考虑 将其扁平化。但是,如果你不想改变 state 的数据结构,你可能更喜欢用一种更便捷的方式来实现嵌套展开的效果。Immer 是一个非常流行的库,它可以让你使用简便但可以直接修改的语法编写代码,并会帮你处理好复制的过程。通过使用 Immer,你写出的代码看起来就像是你“打破了规则”而直接修改了对象:

updatePerson(draft => {draft.artwork.city = 'Lagos';
});

尝试使用 Immer:

  1. 运行 npm install use-immer 添加 Immer 依赖

  2. import { useImmer } from 'use-immer' 替换掉 import { useState } from 'react'

import { useImmer } from 'use-immer';export default function Form() {const [person, updatePerson] = useImmer({name: 'Niki de Saint Phalle',artwork: {title: 'Blue Nana',city: 'Hamburg',image: 'https://i.imgur.com/Sd1AgUOm.jpg',}});function handleNameChange(e) {updatePerson(draft => {draft.name = e.target.value;});}function handleTitleChange(e) {updatePerson(draft => {draft.artwork.title = e.target.value;});}function handleCityChange(e) {updatePerson(draft => {draft.artwork.city = e.target.value;});}function handleImageChange(e) {updatePerson(draft => {draft.artwork.image = e.target.value;});}return (<><label>Name:<inputvalue={person.name}onChange={handleNameChange}/></label><label>Title:<inputvalue={person.artwork.title}onChange={handleTitleChange}/></label><label>City:<inputvalue={person.artwork.city}onChange={handleCityChange}/></label><label>Image:<inputvalue={person.artwork.image}onChange={handleImageChange}/></label><p><i>{person.artwork.title}</i>{' by '}{person.name}<br />(located in {person.artwork.city})</p><img src={person.artwork.image} alt={person.artwork.title}/></>);
}

http://www.ppmy.cn/devtools/144142.html

相关文章

环境变革下 B2B 销售的转型与创新:开源 AI 智能名片与 S2B2C 商城小程序的助力

摘要&#xff1a;本文探讨了在信息科技与互联网迅猛发展所引发的环境改变背景下&#xff0c;B2B 销售工作面临的挑战与机遇。深入分析了传统销售模式的局限性以及新环境对销售人员素质和能力的要求&#xff0c;提出从提供“信息”向提供“业务价值”转变的必要性。同时&#xf…

iOS 核心动画

核心动画 Layer 的自定义动画Layer 自带的仿射动画UIView 隐式动画显式动画CAPropertyAnimation CABasicAnimation repeatCounttimingFunctionfillModedelegate常见的 keyPathCASpringAnimationCAKeyframeAnimation cacluationModerotationMode沿路径的动画CATransitionUIView …

Python中使用单例模式创建类

在 Python 中&#xff0c;实现单例模式有多种方式&#xff0c;每种方式都有其优缺点。先上结论&#xff0c;如果对某种实现方式有兴趣的话可以选择性的阅读。 1. 结论 实现方式优点缺点荐语元类线程安全&#xff0c;灵活实现复杂适合需要灵活性和线程安全的场景threading.Lock…

Pytorch | 从零构建Vgg对CIFAR10进行分类

Pytorch | 从零构建Vgg对CIFAR10进行分类 CIFAR10数据集Vgg网络结构特点性能应用影响 Vgg结构代码详解结构代码代码详解特征提取层 _make_layers前向传播 forward 训练过程和测试结果代码汇总vgg.pytrain.pytest.py 前面文章我们构建了AlexNet对CIFAR10进行分类&#xff1a; Py…

【计组】实验三 ORI指令设计实验

一、实验目的 1. 理解MIPS处理器指令格式及功能。 2. 掌握ori指令格式与功能。 3. 掌握ModelSim和ISE\Vivado工具软件。 4. 掌握基本的测试代码编写和FPGA开发板使用方法。 二、实验环境 1. 装有ModelSim和ISE\Vivado的计算机。 2. Sword\Basys3\EGo1实验系统。 三、实…

TDengine 新功能 从 CSV 批量创建子表

1. 背景 我们在从一些数据源&#xff08;比如关系型数据库&#xff09;批量导入数据前&#xff0c;我们可能需批量创建出所需子表。TDengine 引擎从 v3.3.3.0 版本开始&#xff0c;提供了通过 CSV 文件批量创建子表的功能&#xff0c;使用者只要按约定的格式生成 CSV 文件&…

半导体制造技术导论(第二版)萧宏 第十二章 化学机械研磨工艺

本章要求 1.列出化学机械研磨工艺的应用 化学机械研磨是一种移除工艺技术&#xff0c;结合化学反应和机械研磨去除沉积的薄膜&#xff0c;使表面更加平滑和平坦&#xff1b;也用于移除表面上大量的电介质薄膜&#xff0c;并在硅衬底上形成浅沟槽隔离STI&#xff1b;还可以从晶圆…

ORA-01114 ORA-27072 错误处理方法

Oracle数据库的临时表空间主要用于存储排序操作和其他临时数据&#xff0c;随着时间的推移&#xff0c;这些数据可能会累积并占用大量磁盘空间。 一、问题说明 在创建一张大表的索引时&#xff0c;出现如下错误。 一般出现这种错误&#xff0c;很可能是数据库临时表空间满了或…