# 前言 Immer 是一个用于简化 JavaScript 状态管理的库,以更方便地更新和操作不可变数据 可以解决以下问题: 不可变状态更新:React 推崇使用不可变(Immutable)的数据来管理组件的状态...::: Immer 使得在 React 中使用不可变数据更加容易,通过提供简洁的 API 和直观的语法,以可变的方式更新不可变数据。...React 中使用 Immer ,可以避免手动编写深度克隆、合并对象或数组的代码,同时还能保持数据的不可变性,方便进行状态管理和追踪变更。...# redux 中使用 immer 接下来,让我们看一个使用 Immer 结合 Redux 的示例: import { createStore } from "redux"; import produce...它接收当前状态 state 和表示要进行的更改操作的回调函数。我们可以在回调函数中对 draft 对象进行更改,Immer 会自动处理状态的更新。
redux 的三大原则 redux 的开发和使用必须要遵循三大原则,即: 单一数据源:整个应用的 state 被储存在一棵 object tree 中,并且这个 object tree 只存在于唯一一个...前面我们介绍 redux 三大原则的时候提到过,修改 state 要编写 reducer,且 reducer 必须是一个纯函数,那么问题来了,什么是纯函数呢?...带着这个问题,我们来举个例子验证下,假如我们在一个 reducer 里面直接修改 state 的值,再返回修改后的 state 会发生什么。 我们定义三个组件:App、Title 和Content。...当然,除了 immer 之外,还有别的库也同样能解决我们的问题,但是 immer 应该是最简单也是最容易上手的一个库之一了。...从源码角度分析了需要返回全新state的原因,最后引入了immer库,引入了 immutable 概念,redux 配合 immer 可以方便我们便捷高效的用好 redux。
2 概述 麻烦的 Immutable Immer 想解决的问题,是利用元编程简化 Immutable 使用的复杂度。...所以笔者认真阅读了它的源代码,带大家从原理角度认识 Immer。 Immer 是一个支持柯里化,仅支持同步计算的工具,所以非常适合作为 redux 的 reducer 使用。...最后返回的对象是由 base 的一些属性(没有修改的部分)和 copy 的一些属性(修改的部分)最终拼接而成的。...最大的问题是,最后对代理的 revoke 清洗,需要借助全局变量,这一点阻碍了 Immer 对异步的支持。...4 总结 读到这,如果觉得不过瘾,可以看看 redux-box 这个库,利用 immer + redux 解决了 reducer 冗余 return 的问题。
useReducer 的工作原理与 redux 有些相似,useReducer 返回的数组的第二个参数就像 redux 中的 dispatch,可以派发 action。...immer 库就是为了解决这个问题的。它是 mbox 库的作者的另一个作品,与 mobx 一样简单易用。...它们分别对应 React 当中的 useState 和 useReducer。...返回的同样是 state 和 dispatch。...在 Formik 官网,作者也举例了使用 redux-form 的缺陷: 表单状态本质上是短暂的和局部的,并不需要 redux 对其进行跟踪; 使用 redux 管理状态时,状态更新要派发 action
Redux 出现原因 Redux:全局只有一个唯一的 Store,负责管理整个应用程序所有的状态 出发点:让组件通信更加容易 (opens new window) 特性 Single Source...{ type: 'ADD_TODO', text: 'Learn about actions' } Reducer 本质是个函数,接收 state 和 action,返回新的 state function...发出 action 如何组织 Action 和 Reducer “标准”形式 Redux Action 的问题: 所有 Action 放一个文件,会无限扩展 Action,Reducer 分开,实现业务逻辑时需要来回切换...系统中有哪些 Action 不够直观 更好的组织:单个 action 和 reducer 放在同一个文件 新的方法:每个文件一个 Action 易于开发:不用再 action 和 reducer 文件间来回切换...'] } }); immer 注意,这种适合简单场景,复杂更新会有性能问题 import produce from 'immer'; const state = { filter: 'completed
我个人不是很喜欢讨论这个问题,为什么呢,每个人都学习能力不一样,你要是不行,哪个对于你也不简单。 客观分析,这两种语言都在程序员的工具箱中都占有一席之地。...编程语言就是程序员的工具 例如,锤子和扳手的使用方式截然不同,螺丝刀与钢锯的用途不同,假设现在是午夜,工匠想把钉子钉在墙上,但他唯一的工具是扳手,螺丝刀和钢锯?哪个最合适?...Java代码编译为字节码 - 一种直接转换为本机代码的中间语言。 Java的语法大量借鉴了C ++和其他面向对象的语言,如Smalltalk,Ada和Modula-3,因此其强大的输入影响力。...因此,具有C ++和其他语言经验的程序员会发现学习起来非常舒服。...变量x和y是整数,因此z变为整数,因此它被取整为2,但Python隐藏了这些东西。这看起来都很神奇。 而在Java中,变量的类型更明确。这样的困惑就少来很多。
大家好,又见面了,我是你们的朋友全栈君。 我个人不是很喜欢讨论这个问题,为什么呢,每个人都学习能力不一样,你要是不行,哪个对于你也不简单。 客观分析,这两种语言都在程序员的工具箱中都占有一席之地。...编程语言就是程序员的工具 例如,锤子和扳手的使用方式截然不同,螺丝刀与钢锯的用途不同,假设现在是午夜,工匠想把钉子钉在墙上,但他唯一的工具是扳手,螺丝刀和钢锯?哪个最合适?...Java代码编译为字节码 – 一种直接转换为本机代码的中间语言。 Java的语法大量借鉴了C ++和其他面向对象的语言,如Smalltalk,Ada和Modula-3,因此其强大的输入影响力。...因此,具有C ++和其他语言经验的程序员会发现学习起来非常舒服。...变量x和y是整数,因此z变为整数,因此它被取整为2,但Python隐藏了这些东西。这看起来都很神奇。 而在Java中,变量的类型更明确。这样的困惑就少来很多。
如何开始 React 如果你是一个完全不熟悉 React 的初学者想创建一个 React 项目,加入 React 的世界。有许多工具包项目可以选择,每个项目都试图满足不同的需求。...如果你已经熟悉 React,你可以选择它流行的入门工具包之一: Next.js 和 Gatsby.js。这两个框架都建立在 React 之上,因此你应该已经熟悉 React 的基本原理。...如果您只是想了解这些初学者工具包是如何工作的,那么可以尝试从头开始设置 React 项目。你将从一个基本的 HTML 和 JavaScript 项目开始,然后自己添加 React 和它的支持工具。...如果你想选择一个自定义样板项目,试着缩小你的要求。样板文件应该是最小的,不要试图解决所有问题。它应该针对你的问题。...就我个人而言,我不使用它,但是任何时候有人问到 JS 中的不变性(immutability),大家都会指出 Immer,并且这可以加上 redux 或 React hooks。
虽然文档写得不怎么样,但是里面确实给了很多比较好的代码组织方式,推荐了很多很有用的工具和插件,也慢慢地理解为什么这么简单的一个状态中心可以搞出这么多概念和库。...第三版:React + Redux 其实 redux 和 react 毛线关系都没有,真实让他们产生关系的是 react-redux 这个库。...redux 官方其实是推荐使用 immer 这个库来做 immutable 的。...handler(todos, action) : todos } 使用了 immer 之后,数组的 push 和直接赋值写法都可以直接用了,代码就感觉更好看一些。...为什么要我自己去用 React.memo 和 useCallback 来做优化?为什么要我自己去装 redux-thunk 和 immer?
是好处也是坏处, 对于团队和初学者来说没有约束会导致风格不统一,无法控制项目熵增。好处是可以自定义自己的约束 性能优化....它的应用工作流如下: image.png 特性: 整合了 Redux 生态比较流行的方案: immer(不可变数据变更),redux-saga(异步数据流处理),reselect(选取和映射 state...对于 Redux 目前比较流行的组合就是: immer+saga+reselect 二,太多模板代码。...如使用 saga 或 redux-promise 简化了不可变数据的操作方式。 如使用 immer 简化 reducer。...这样一来 Windows 不需要学习 React 和视图展示,我们也不需要关系他们复杂的业务逻辑(底层还是使用 C++, 暴露部分接口给 node) 七,可能还有性能问题 Redux 常见问题:性能
又学完了 immer,我们来对比下 immutable 和 immer: 直接看图吧: class 组件里,immutable 这样写: immer 这样写: function 组件里,immutable...: state.dongdong } } 从结合 redux 的角度来看,也是 immer 在体验上完胜。...主流的 immutable 库有两个, facebook 的 immutable 和 MobX 作者写的 immer。...immer 只有一个 produce api,传入原对象和修改函数,返回的就是新对象,使用新对象就是普通 JS 对象的用法。...从使用体验上来说,不管是和 react 的 setState 结合还是和 redux 的 reducer 结合,都是 immer 完胜,但是 immutable 因为有专用数据结构的原因,在有大 state
),每次都不得不深拷贝整个对象;当对象特别大的时候,深拷贝会导致性能问题。...为了解决这种问题,Immer来了 Immer初登场 那么Immer是个啥呢,用官方的话说就是 Immer (German for: always) is a tiny package that allows...,我们通过Immer提供的produce方法,可以直接像深拷贝那样,在新对象上做修改 更重要的是,在 immer 的背后做了性能优化,而不是简单的全部深度拷贝,所以不用担心性能问题 Immer 的优点...Immer有着许多便捷和性能上的优势: 遵循不可变数据范式,同时使用普通的JavaScript对象、数组、集合和映射,上手即用 开箱即用的结构共享 开箱即用对象冻结 更新轻而易举 冗余代码更少 对JSON...break; default: break; } }, [ /* initial todos */ ] ); 以及配合Redux
本文作者:IMWeb forsigner 原文出处:IMWeb社区 未经同意,禁止转载 说到 React 状态管理,必提的肯定是 Redux 与 MobX,2018 年快过去了,它们依然是最火热的状态管理工具...,也有一些基于 Redux 的,如 dva、rematch 等,也有新的,如 mobx-state-tree,这里不对各个解决方案作评价。...高效 更高的开发效率,这很重要 Typescript state 和 action 高度支持智能提示 我是个实用主义者,开发效率、代码可维护性和可读性、开发体验大于各种什么范式、各种理论,也不需要装纯...有一天,我看到了 mobx 作者的 immer, 我感觉使用 immer, 可以实现一个我理想中的状态管理工具,所以就造了一个轮子,叫 stamen, 他有什么特点呢,Show you the code...如果有什么核心特点的话,那应该是 "简洁",这里指的是使用者写代码时简洁,可以专注于业务,而不是自身源代码简洁,把问题留给使用者。
作者从 6 个角度阐述了基于 redux 的框架需要解决什么问题。...instialState 也存在同样问题,相比显示申明,将 preloadedState 作为函数入参就比较抽象了,同时 redux 对初始 state 的赋值也比较隐蔽,createStore 时统一赋值比较别扭...存在的工程问题分析透彻了,同时还给出了一套非常好的实现。...内置了比较多的插件 rematch 将常用的 reselect、persist、immer 等都集成为了插件,相对比较强化插件生态的概念。...比如 rematch-immer 插件,可以用 mutable 的方式修改 store: const count = { state: 0, reducers: { add(state)
Zustand 是一个为 React 应用程序设计的状态管理库,与其他流行的状态管理库如 Redux 和 MobX 相比,它提供了一些独特的优势和特性。...性能优化 Zustand 通过自动缓存状态值来减少不必要的组件渲染,从而提高性能。它还解决了 Redux 中的“死节点”问题,即在某些情况下,子组件可能无法正确更新的问题。...此外,Zustand 通过使用 React 的上下文和钩子系统,避免了 Context loss 问题,这在某些复杂的组件结构中可能会出现。 4....中间件支持 Zustand 支持大量的中间件,如 Immer、Redux 中间件等,这使得开发者可以根据需要轻松地扩展 Zustand 的功能。...调试和开发体验 Zustand 提供了良好的调试体验,它与 Redux DevTools 兼容,使得开发者可以轻松地检查和调试状态变化。
而就像 Redux 一样,Mvvm 框架中也出现了许多与框架解耦的库,比如 Mobx、Immer、Dob 等,这些库需要一个中间层与框架衔接,比如 mobx-react、redux-box、dob-react...有问题自然有人会解决,Mobx 作者的 Immer 库完美的解决了问题。 ? 原理是通过 proxy 返回代理对象,在内部通过浅拷贝替代对对象的 mutable 更改。...具体原理可以参考我之前的一篇文章《精读 Immer.js 源码》。 ?...(obj => obj.count++) } 上面这种看似 mutable 的写法其实是零副作用的纯函数,和下面写法等价: typescript function inc(obj) { return {...Mvvm 与 Reactive programming 的结合 既然 redux 可以与 rxjs 结合(redux-observable),那么 mvvm 应该也可以如此。
如果需要全局状态管理,可以选择加入 React 内置的 useContext Hook 来将 props 从顶层组件传递到底层组件,从而避免 props 多层透传的问题。...它允许你管理应用程序的全局状态,任何连接到其全局存储的 React 组件都可以读取和修改这些状态。 如果你碰巧在用 Redux,你一定也应该查看 Redux Toolkit。...链接: React Router:https://reactrouter.com/ ---- 样式/CSS 在 React 中有很多关于 样式/CSS 的选项和意见,作为一个 React 初学者,可以使用一个带有所有...但是,如果你觉得需要强制执行不可变数据结构,那么最受欢迎的选择之一是 Immer 。...链接: Immer:https://github.com/immerjs/immer ---- 国际化 当涉及到 React 应用程序的国际化 i18n 时,你不仅需要考虑翻译,还需要考虑复数、日期和货币的格式以及其他一些事情
Redux Toolkit 是官方推荐用来简化Redux开发的工具集。它包含了一些预设的最佳实践,使得创建和管理Redux状态变得更简单。1....Dispatching Actions在React组件中,你可以使用useDispatch和useSelector这两个react-redux的hook来派发action和获取状态。...中间件集成Redux Toolkit允许你方便地添加和管理多个中间件,如日志、错误处理等。...Performance MonitoringRedux Toolkit与Redux DevTools扩展配合使用,可以方便地监控应用的状态变化,包括时间旅行、快照对比等,这对于调试和优化性能非常有用。...Redux Toolkit提供了许多工具和最佳实践,帮助开发者更高效地管理React应用的状态。通过合理利用这些特性,可以构建出更健壮、易于维护的项目。
,后者是 React 和 Redux 的 binding,用于触发组件重新渲染。...关于 Redux 更详细的原理和解释,可以参考我的这篇文章:从零实现 redux 和 react-redux 4....设计上的一个问题。...所以在 Redux 中就需要额外的 reselect 库来实现 computed 这个功能。 但是 Mobx 中提供了和 Vue 类似的 computed 来解决这个问题。...import produce from 'immer'; const handleToggleComplete = (id) => { const index = findIndex(todos,
: {}} 结构 使用 redux-thunk 来做异步,手动返回函数 手动使用表驱动来替换 reducer 的 switch-case 模式 手动将 selector 进行封装成函数 手动引入 immer...不过,带来的问题就是每次都这么写,累不累?...注意:createSlice 里的 reducer 里可以直接写 mutable 语法,这里其实是内置了 immer。...case,这种做法仅仅是为了 TS 服务的,所以你喜欢之前的 toString 写法也是没问题的。...createReducer + createAction 其实 redux-toolkit 里面有挺多好的东西的,上面所说的 API 大概覆盖了 80% 了,剩下的还有 createReducer 和
领取专属 10元无门槛券
手把手带您无忧上云