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

Immer使用指南

(如果没有在 draft 中对 state 对象做修改,那么返回和原对象是一样,绝对相等) 此外,它还使得克隆成本相对较低: 原对象中,未更改属性(树)部分不做复制,在内存中与原旧版本属性共享属性...当你写完之后,助手就会拿起你草稿,根据草稿内容为你写出真正不能再被修改、最后版本书信(即下一个状态)。 Immer 优势: 1....显然 produce 返回 nextState 对象和原来 baseState不一样了。 这是为什么呢?...当访问 draft 时,其定义 getter 会返回一个 Proxy 代理对象。 如果在 draft 中没有变更或者变更和原对象一致,则返回原对象。...很显然,经过 immer 处理之后 nextState 修改属性时候报错了。 而且,原对象 baseState 修改属性时候同样会报错。 immer变了原对象!!!

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

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

我们测试一下: 用上图方式 setState,整个 state 变了,但是 key 对应没有变。...时,会对比 state 本身变没变,变了就会重新渲染 为什么 function 组件里只对比了 state 没有对比每个 key 也很容易理解,因为本来每个 state就是用 useState 单独声明了...但这样又有了一个问题: 如果 state 内容很多呢? 而你只想修改其中一部分,要把整个对象复制一次: 是不是很麻烦? 能不能修改了对象,立马给我返回一个对象呢?...这样返回是 immutable 数据结构,并且对 b 做了修改: 你和之前 a 属性对比下,发现也不一样了: 这就是它作用,修改以后返回 immutable 数据结构。...immer 只有一个 produce api,传入原对象和修改函数,返回就是对象,使用对象就是普通 JS 对象用法。

42020

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

自从React hooks发布以来已经有一段时间了,很喜欢这个特性。这个hooks把勾上了! Hooks允许我们创建更小,可组合,可重用,更易管理React组件。...这样看起来,reducer简洁干净多了。 但是,现在reducer更新参数中如果有回调函数,则不能基于当前状态计算状态,因为当前state没有传递给回调函数作为参数。...因此,您可以使用包含要更新状态片段对象调用updateState,并将其与旧状态合并并返回状态。...immerproduce函数将对象作为其第一个参数进行处理,在我们例子中是当前状态,它第二个参数是一个函数,它接收对象草稿副本以进行mutate,无论你在这个函数内修改了什么草稿状态,是在副本上完成...然后,它会自动返回包含更新数据对象。 这就是我们增强版reducer。 安装一下依赖,就可以跑起来了。 ?

3.3K20

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

React心智负担 为什么要这样写?...,以及一个修改传入状态函数,在修改状态函数中,所有标准JavaScriptAPI都可以用于draft(草稿)对象,然后返回一个状态,但是原始状态不会受到影响。...,我们通过Immer提供produce方法,可以直接像深拷贝那样,在对象上做修改 更重要是,在 immer 背后做了性能优化,而不是简单全部深度拷贝,所以不用担心性能问题 Immer 优点...(草稿)给我们 我们在 draft 上作修改 immer 接收修改后draft,immer 基于传入 state 照着draft 修改 返回一个 state Immer Hook 如果你觉得每次调用...Immer使用方法,希望对你有用,当然,如果可以的话不妨点个赞再走呢,这对很重要。

64741

redux你用对了吗?

add 返回永远只依赖他入参 a 和 b,不管外部变量 x 如何变化,也不会影响到函数 add 返回。...为什么reducer需要返回一个全新state 上面我们介绍了什么是纯函数,redux 里面规定 reducer 必须是一个纯函数,并且每个纯函数需要返回一个全新state,那么这里大家肯定就有一个疑问...,为什么 reducer 必须要返回一个全新 state,直接修改完了 state 再返回不行吗?...immer 上面我们已经分析了 redux 里面的 reducer 为什么返回一个全新 state,但是,如果按照上面 reducer 写法,要修改 state 树层级深了之后,修改起来无疑是非常麻烦...,什么是纯函数,以及为什么 reducer 需要返回一个全新 state ?

56030

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

increment 函数会更新 state count 。 因为 state 改变了,React 会重新渲染 Counter 组件(以及它子元素),这样就会显示计数值。...我们必须提供一个返回 state 函数。这个函数被称为 reducer(我们马上就知道为什么了)。...你函数调用时会接收两个参数:上一次迭代结果,和当前数组元素。它结合当前元素和之前 “total” 结果然后返回 total 。...给 Reducer 一个初始状态 记住 reducer 职责是接收当前 state 和一个 action 然后返回 state。 它还有另一个职责:在首次调用时候应该返回初始 state。...但是向你展示这种困难方式是因为很多代码仍然采用这种方式,你一定会看到没有Immer reducers 全部规则 必须返回一个 state,不要改变 state,不要 connect 每一个组件

4.2K20

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

性能优异 由于提前做了浅克隆操作,且只克隆读取过路径并改变父子节点相互之间路径指向,在结束草稿时只需判断modified变量真假来瞬间完成副本生成动作,在数据大读取少场景性能超过immer20...优化过程 在3.12之前,limu虽然性能已超过immer数倍,但离structura、mutative这些不可变数据操作库还有不少差距,故只能把调试友好、比immer快几倍来作为宣传点,如需追求极致速度还是默认推荐了...最终想到了es6数据结构Map,在createDraft时为每一个草稿生成一个metaMap,用于放置数据对应meta即可,伪代码如下: function getProxy(metaMap, dataNode...性能测试 我们已经性能测试相关代码放置到benchmark,你只需要执行以下步骤即可体验到最新版本性能测试表现。...api设计,如没有用到immerapplyPatches相关api,可实现无感平替。

17010

每周学点大数据 | No.38平均数计算

希望借助这个例子,仔细讲解一下关于combiner 问题。 小可:从前面的例子可以看出,其实 combiner 和 Reducer 挺像,它们做都是合并工作。 Mr. 王:没错。...至于 Reducer,它是根据字符串进行匹配,将具有相同键值字符串以及对应整数值收集到一起,然后剩下部分就是对这些求平均数, sum 累计所有的整数 r, cnt对其出现 r 数量进行计数...,最后返回它。...小可恍然大悟,说:哦,这个版本的确有问题, combiner 不仅进行了优化,而且还改变了输入输出数据类型,如果在这里去掉 combiner 的话,那么 Mapper 函数输出数据类型与Reducer...王:想想看,还可以怎么? 小可:嗯,这次即使把 combiner 彻底去掉,也不会影响整个程序运行结果,只是在Mapper 上面稍作修改,效果还是很好。 Mr.

1.1K80

Redux 源码解析系列(一) -- Redux实现思想

但是这里存在一个风险就是,谁都可以修改appState,换句话说,有一天当appState变了你都不知道是谁,所以我们需要有一个管理员来帮我们管理我们状态,这时候引入了dispatch函数,来专门负责修改数据...到这一步,一个APP就已经可以无压力跑起来啦,最后一步,当然是关注性能,我们这个app 还是有严重性能问题,因为每一次dispatch 一次action,不管数据有没有变化,组件都会被重新渲染,这当然是不必要...3、为什么reducer是纯函数 所以就需要对reducer产生前后appState进行一个对比,这就要求reducer必须是一个纯函数,返回是一个object,不能直接更改reducer参数...} return {getState, dispatch, subscribe} } OK,到这一步,我们redux就基本完成啦~ 接着改装下我们reducer,让它有一个初始,这样我们...返回是一个object,那在外层,我们就可以对比nextProps跟t his.props 来决定是否渲染 state = reducer(state, action) listeners.forEach

55710

Redux 源码解析系列(一) -- Redux实现思想

但是这里存在一个风险就是,谁都可以修改appState,换句话说,有一天当appState变了你都不知道是谁,所以我们需要有一个管理员来帮我们管理我们状态,这时候引入了dispatch函数,来专门修改负责数据修改...到这一步,一个APP就已经可以无压力跑起来啦,最后一步,当然是关注性能,我们这个app 还是有严重性能问题,因为每一次dispatch 所有的子组件都会被重新渲染,这当然是不必要。...所以就需要对reducer产生前后appState进行一个对比,这就要求reducer必须是一个纯函数,返回是一个object,不能直接更改reducer参数,这样才能够对比可以通过对比前后...} return {getState, dispatch, subscribe} } OK,到这一步,我们redux就基本完成啦~ 接着改装下我们reducer,让它有一个初始,这样我们...返回是一个object,那在外层,我们就可以对比nextProps跟t his.props 来决定是否渲染 state = reducer(state, action) listeners.forEach

69150

Redux Toolkit

它最初创建是为了帮助解决关于 Redux 三个常见问题: “配置 Redux 存储太复杂了” “必须添加很多包才能让 Redux 做任何有用事情” “Redux 需要太多样板代码” 我们无法解决所有用例...安装 使用 React 和 Redux 启动应用程序推荐方法是使用官方 Redux+JS 模板或Redux+TS 模板来创建 React App,它利用了Redux Toolkit和 React Redux...此外,它自动使用该immer库让您使用普通可变代码编写更简单不可变更新,例如state.todos[3].completed = true. createAction():为给定动作类型字符串生成动作创建函数...函数对象、切片名称和初始状态,并自动生成切片reducer,并带有相应动作创建者和动作类型。...createAsyncThunk: 接受一个动作类型字符串和一个返回承诺函数,并生成一个pending/fulfilled/rejected基于该承诺分派动作类型 thunk import { createAsyncThunk

9810

成为一名高级 React 需要具备哪些习惯,他们都习以为常

假设你已经知道React基础知识,因此不会涉及“不要改变道具或状态”这样陷阱。 坏习惯 本节中每个标题都是你应该避免坏习惯! 将使用一个典型待办事项列表应用程序示例来说明一些观点。...我们需要跟踪待办事项列表上项目,以及哪些项目已经被选中。...当状态更新很简单时,useState是非常好。例如,可以用 usestate跟踪复选框是否被选中,或者跟踪文本输入。 话虽如此,当状态更新变得稍微复杂时,您应该使用一个reducer。...发现中级React开发人员通常不编写测试,即使测试需要5分钟时间来编写,并且具有中等或高影响!将这些情况称为测试“低垂果实”。试试低垂果实!!...最好前端开发者也是可用性和网页设计方面的专家,即使这并没有反映在他们工作头衔上。 可用性只是指应用程序使用起来有多容易。例如,添加一个待办事项到列表中有多容易?

4.7K40

完全理解 redux(从零实现一个 redux)

/*来订阅一下,当 count 改变时候,要实时输出新*/ subscribe(() => { console.log(state.count); }); /*我们来修改下 state,当然我们不能直接去...我们知道 reducer 是一个计划函数,接收老 state,按计划返回 state。那我们项目中,有大量 state,每个 state 都需要计划函数,如果全部写在一起会是啥样子呢?...counterReducer(state, action) { /*注意:如果 state 没有初始,那就给他初始!!...记录日志 现在有一个需求,在每次修改 state 时候,记录下来 修改前 state ,为什么修改了,以及修改后 state。...只要传入参数相同,返回计算得到下一个 state 就一定相同。没有特殊情况、没有副作用,没有 API 请求、没有变量修改,单纯执行计算。

80910
领券