首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

使用Immer解决React对象深度更新的痛点

复杂对象的更新 在组件,工单的所有参数都保存在一个对象,像这样 const [formConfig,setFormConfig] = useState( { type: ''...} return item }) }); 这样的写法不难看出很多问题: 我们不得不写很多操作修改以外的代码 每深入对象一层,扩展语法后的路径也需要再进一层(...Immer可以帮助我们更方便的处理不可变的状态。...,以及一个修改传入状态的函数,在修改状态的函数,所有标准的JavaScriptAPI都可以用于draft(草稿)对象,然后返回一个新的状态,但是原始的状态不会受到影响。...以前面修改表单配置的方法为例,使用Immer我们上面的状态修改就可以这样写: import {produce} from "immer" setFormConfig(prevState => {

70041

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

# 前言 Immer 是一个用于简化 JavaScript 状态管理的库,以更方便地更新和操作不可变数据 可以解决以下问题: 不可变状态更新:React 推崇使用不可变(Immutable)的数据来管理组件的状态...而使用 Immer,可以通过直接在原始状态上进行修改,以一种可变的方式更新状态。...我们使用 produce 函数将状态更新的逻辑放在一个回调函数,然后将回调函数传递给 setState。...Immer 会根据我们的更改生成一个新的不可变对象,并将其作为新的状态进行更新。...它接收当前状态 state 和表示要进行的更改操作的回调函数。我们可以在回调函数对 draft 对象进行更改,Immer 会自动处理状态更新

61620
您找到你想要的搜索结果了吗?
是的
没有找到

鲁迅:世上本只需要一个Modal组件

unstated-next 主要是利用 React.createContext 状态共享,将需要注入 Provider 的状态以及状态更新操作抽象到 hook ,提供给 Function Component...一个用于将 immer 作为 React hook 来操纵状态的 hook。 use-immer 可以将 state 数据 immutable,更新深层嵌套数据更为方便,且有函数编程的感觉。...每次只有一个激活的modal和选中的数据一一对应,两者都是用操作的一瞬间确定的,且每次只有一个 modal 处于激活状态,所以用户的各种操作只是不断更新modal和data而已。...在使用modal的页面,我们只需不断去更新全局记录值,当modal关闭时只需全局记录值置为空即可。这样在当前的页面不需要再将烦人的众多modal一次次的引入,也不需要维护一系列的visible。...问题来了,那全局记录值modal呢?

1.5K10

放弃Redux吧,转投Zustand吧

Zustand 是一个为 React 应用程序设计的状态管理库,与其他流行的状态管理库 Redux 和 MobX 相比,它提供了一些独特的优势和特性。...性能优化 Zustand 通过自动缓存状态值来减少不必要的组件渲染,从而提高性能。它还解决了 Redux 的“死节点”问题,即在某些情况下,子组件可能无法正确更新的问题。...中间件支持 Zustand 支持大量的中间件, Immer、Redux 中间件等,这使得开发者可以根据需要轻松地扩展 Zustand 的功能。...开发者可以使用 useStore 钩子来获取更新状态,而不需要通过多层的组件传递 props 或者使用 React Context。 6....在组件中使用 store 在你的 React 组件,使用 useStore 钩子来访问和更新 store 状态。 import { useStore } from '.

36810

Immer使用指南

Immer 是一个很小的包,它能让您以更方便的方式处理不可变状态(immutable state)。...(如果没有在 draft 对 state 对象做修改,那么返回值和原对象是一样的,绝对相等) 此外,它还使得克隆成本相对较低: 原对象,未更改的属性(树)部分不做复制,在内存与原旧版本的属性共享属性...但是,这在实践,可能导致写出相当繁琐的代码,并且很容易意外影响到原对象。 Immer 的出现就是为了解决这些问题,它能解决如下痛点: 1.Immer会检测到意外变更并抛出错误。...2.Immer能避免对不可变对象进行深度更新时,所需要的常规手动拷贝代码的实现 如果没有Immer,对象副本需要在每一级上手工创建其副本,通常通过使用很解构操作(…obj)操作。...深度更新轻而易举,不需要人工考虑其数据结构会被影响或者遗漏。 5. 使用简单,能使代码更简洁。 6. 对JSON补丁的一流支持 7.

1.7K20

使用React hooks处理复杂表单状态数据

让我们考虑一个场景,您必须管理具有多个输入的复杂表单状态,这些表单输入可以是几种不同的类型,文本,数字,日期输入。...但是,现在reducer更新参数如果有回调函数,则不能基于当前状态计算新状态,因为当前state没有传递给回调函数作为参数。就像我们在useState一样: ?...useState更新函数可以基于prev参数计算新状态 另外,如何更新嵌套状态address.addressLine1,address.pinCode。...为了绕过这个,我们使用immer,来轻松地处理Javascript对象的不变性。 ?...immer的produce函数将对象作为其第一个参数进行处理,在我们的例子是当前状态,它的第二个参数是一个函数,它接收对象的草稿副本以进行mutate,无论你在这个函数内修改了什么草稿状态,是在副本上完成的

3.3K20

redux你用对了吗?

store State 是只读的:唯一改变 state 的方法就是触发 action,action 是一个用于描述已发生事件的普通对象。...简单总结一下,如果一个函数的返回结果只依赖他的参数,并且在执行过程没有副作用,我们就把这个函数定义为纯函数。...,所以它们的 title 属性指向的对象是不同的, 使用一个树状结构来表示对象结构的话,结构如下所示: 共享结构 现在的 reducer: reducers: { changeTitleTip...出于性能考虑,redux 直接采用了浅比较,也就是说比较的是两个对象的引用地址,所以,当 reducer 函数直接返回旧的 state 对象时,这里的浅比较就会失败,redux 认为没有任何改变,从而导致页面更新出现某些意料之外的事情...当然,除了 immer 之外,还有别的库也同样能解决我们的问题,但是 immer 应该是最简单也是最容易上手的一个库之一了。

57030

为什么说 90% 的情况下,immer 能完胜 immutable?

假设 React 组件有这样一个状态: this.state = { a: { b: 1 } } 我们这样修改了它的状态: this.state.a.b = 2; this.setState...我们从源码看一下: 首先是继承 PureComponent 的 class 组件: 你会发现 React 在更新 class 组件的时候,会判断如果是 PureComponent,那么会浅比较 props...再在 function 组件里用下: function 组件里就可以这样写了,把整个 state 用 fromJS 变为 immutable 的,然后后面修改用 setIn,获取用 getIn。...又学完了 immer,我们来对比下 immutable 和 immer: 直接看图吧: class 组件里,immutable 这样写: immer 这样写: function 组件里,immutable...这样写: immer 这样写: 没有对比就没有伤害,从使用体验上,immer 完胜。

42520

简洁的 React 状态管理库 - Stamen

本文作者:IMWeb forsigner 原文出处:IMWeb社区 未经同意,禁止转载 说到 React 状态管理,必提的肯定是 Redux 与 MobX,2018 年快过去了,它们依然是最火热的状态管理工具...,也有一些基于 Redux 的, dva、rematch 等,也有新的, mobx-state-tree,这里不对各个解决方案作评价。...所以,我想要这样的一个状态管理库: 轻量 个人做移动端开发比较多 简洁 没模板代码, 尽量少的 Api 符合直觉 没复杂的概念, 给个 action 改 state 就好 清晰 更易写出可维护和可读性好的代码...有一天,我看到了 mobx 作者的 immer, 我感觉使用 immer, 可以实现一个我理想状态管理工具,所以就造了一个轮子,叫 stamen, 他有什么特点呢,Show you the code

1K30

【React】211- 2019 React Redux 完全指南

Action 对象描述你想做出的改变(“增加 counter”)或者将触发的事件(“请求服务失败并显示错误信息”)。 尽管 Actions 名声响亮,但它是无趣的,呆板的对象。...我整理了一个如何在 Redux 里做 Immutable 更新完全指南,包含更新 state 对象和数组的七个通用模式。 安装 Immer 在 reducers 里面使用也是一种很好的方式。...Immer 让你可以像写普通 mutable 代码一样,最终会自动生成 immutable 代码。点击了解如何使用 Immer。 建议:如果你是开始一个全新的应用程序,一开始就使用 Immer。...如何在 React 中使用 Redux 此时我们有个很小的带有 reducer 的 store,当接收到 action 时它知道如何更新 state。...有时你要获取整个应用都需要的真正的全局数据 —— “用户信息”或者“国际化”。

4.2K20

9 个超实用的 JavaScript 原生插件工具

对浏览器运行的任何内容进行快速可靠的测试。 Cypress允许你创建可以与单击按钮交互的测试,填写表格,这个很好地支持定期更新。...它可以轻松优化ES模块以在现代浏览器更快地本地加载,并放置允许ES 模块工作流的遗留模块格式。...由于支持tree shaking,它是一个很棒的模块打包器,虽然不像Parcel或Webpack那样出名,但它仍然随着响应式更新而增长。...4、 immer 地址:https://github.com/immerjs/immer ? 通过改变当前状态来创建下一个不可变状态。...非常轻量级的包(5KB),有助于处理React应用程序的不可变状态,我们只需要通过不干扰原始状态来更改虚拟状态,然后,一旦所有更改完成,它就会推送下一个状态

1.2K20

潜心优化,limu终达不可变数据性能之巅

limu面向现代浏览器而设计,只考虑支持Proxy的运行环境,使用了读时浅复制写时标记更新的机制来达到让用户像操作原始数据一样操作可变数据,操作过程始终只为读取节点生成代理对象返回给用户,读取后父子节点间直接用浅克隆节点相连...,proxy对象隐藏到节点的meta数据,结束操作后生成一个具有结构共享特性的新数据,同时移除这些读取过程中生成的meta数据。...proto藏匿meta 为了让数据干净,于是除了继续用LIMU_META这个symbol作为私有属性之外,将这个属性提升到__proto__藏匿,那么问题来了,如果直接操作__proto__,就污染了原型链...(); 定制优化方案 通过不停地注释代码跑脚本分析出性能损耗点后,我们的目标就很明确了,如何既能够屏蔽delete和setPrototypeOf这两个性能消耗大户,还能够保持数据干净和meta能够正常获取...api设计,没有用到immer的applyPatches相关api,可实现无感平替。

19510

Reducer:让代码更灵活&简洁

解决问题: 分散的 state,导致代码扩展&维护困难; 对于输入值的控制/转换等(希望限制age在1-120之间) React 表单场景的开发,往往需要维护众多 state (,表单数据...useReducer 对于拥有许多状态更新逻辑的组件来说,过于分散的事件处理程序可能会令人不知所措。 对于这种情况,可以将组件的所有状态更新逻辑整合到一个外部函数,这个函数叫作 reducer。...入参:reducer function myReducer (state, action) { // 给 React 返回更新后的状态 return {...} } 声明当前状态(state)作为第一个参数...dispatch 函数 是为下一次渲染而更新 state。因此在调用 dispatch 函数后读取 state 并不会拿到更新后的值,也就是说只能获取到调用前的值。...React 会批量更新 state。state 会在 所有事件函数执行完毕 并且已经调用过它的 set 函数后进行更新,这可以防止在一个事件多次进行重新渲染。

8700

共享可变状态中出现的问题以及如何避免

通过复制数据避免共享 在开始研究如何避免共享之前,我们需要看一下如何在 JavaScript 复制数据。 浅拷贝与深拷贝 对于数据,有两个可复制的“深度”: 浅拷贝仅复制对象和数组的顶层条目。...非破坏性更新是对不变数据的补充,使其与可变数据一样通用,但没有相关风险。 用于避免共享可变状态的库 有几种可用于 JavaScript 的库,它们支持对不可变数据进行无损更新。...Immer 还支持不可变性和非破坏性更新,但仅适用于普通对象和数组。...在 D 行,我们使用 Immutable 的内置 .equals() 方法来检查是否确实撤消了更改。 Immer 在其存储库Immer 库 的描述为: 通过更改当前状态来创建下一个不可变状态。...Immer 有助于非破坏性地更新(可能嵌套)普通对象和数组。也就是说,不涉及特殊的数据结构。

1.5K40
领券