首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >忘掉 Redux,拥抱 Zutand 和 Jotai 的全新世界

忘掉 Redux,拥抱 Zutand 和 Jotai 的全新世界

作者头像
井九
发布于 2024-10-12 01:42:41
发布于 2024-10-12 01:42:41
22800
代码可运行
举报
文章被收录于专栏:四楼没电梯四楼没电梯
运行总次数:0
代码可运行

Redux 在现代 React 开发中存在着一些明显的局限性。

首先,Redux 的心智负担较重。它涉及到众多概念,如 Store、Reducer、Action 等,对于初学者来说,理解和掌握这些概念需要花费较多的时间和精力。而且,Redux 要求严格遵循其特定的架构和模式,这在一定程度上限制了开发者的灵活性,增加了开发的复杂性。

其次,开发过程较为繁琐。在 Redux 中,每次新增功能都需要定义相应的 Reducer、Action Creator 等,同时还需要处理各种模板代码,导致文件切换频繁,开发效率低下。此外,Redux 对于状态的修改必须通过派发 Action 并由纯函数 Reducer 处理,这种严格的规定在某些简单场景下显得过于繁琐。

再者,复杂的异步任务管理也是 Redux 的一个痛点。虽然有一些解决方案如 Redux-thunk、Redux-saga 等,但它们也带来了额外的学习成本和代码复杂度。在处理多个异步任务的并行、串行等复杂关系时,Redux 及其相关中间件的配置和管理并不直观,容易出现错误且难以调试。

总之,尽管 Redux 为状态管理提供了一种可预测和可控的方式,但由于其心智负担、开发繁琐和复杂异步任务管理等问题,在现代 React 开发中,开发者可能会寻求更轻量、更便捷的状态管理方案。

二、Zutand 的魅力所在

(一)轻量高效

Zutand 以其轻量高效的特点吸引着开发者。它采用简洁的设计,核心代码量少,减少了不必要的复杂性。在实现高效的状态管理方面,Zutand 巧妙地运用了现代 JavaScript 的特性,例如钩子函数(Hooks),避免了繁琐的配置和大量的样板代码。其状态更新机制直接而高效,只在状态值发生实际变化时触发相关组件的重新渲染,极大地提高了应用的性能和响应速度。

(二)灵活的状态存储

Zutand 在状态存储方面表现出极高的灵活性。它不仅支持全局的状态存储,使整个应用可以共享关键的状态信息,还允许分散存储,方便各个组件根据自身需求管理局部状态。这种灵活性使得开发者能够根据具体的应用场景和架构需求,合理地组织和管理状态,避免了不必要的状态传播和混乱。

(三)优秀的特性与功能

Zutand 具备许多优秀的特性和功能。它能够自动对比状态的新旧值,精确判断是否需要触发组件的重新渲染,确保了应用的性能优化。此外,Zutand 还支持派生状态,允许开发者基于现有状态计算和衍生出新的状态,增强了状态管理的灵活性和可扩展性。同时,Zutand 与 React 的集成紧密且自然,为开发者提供了流畅的开发体验。

三、Jotai 的独特优势

(一)原子化设计理念

Jotai 的原子化设计理念是其独特之处。在状态管理中,原子化意味着将状态拆分成最小的、独立的单元,即原子(Atoms)。每个原子都可以独立管理和更新自身的状态,而不会影响其他原子。这种设计使得状态管理更加模块化和可维护。

例如,当一个原子的状态发生变化时,只有依赖于该原子的组件会进行重新渲染,而不会导致整个应用的大规模重绘,从而提高了性能和效率。同时,原子化也便于开发者更清晰地理解和管理应用的状态结构,避免了状态的混乱和不可控。

(二)简单易用的 API

Jotai 提供了简洁直观的 API,极大地提升了开发效率。其核心的 atom、useAtom 等函数使用起来非常方便。

atom 函数用于创建原子,定义状态的初始值和更新逻辑。而 useAtom 钩子则允许组件轻松地读取和更新原子的状态,就像使用 useState 一样简单直接。

例如,通过 const [value, setValue] = useAtom(atom) 这样的简洁代码,开发者可以快速获取和修改状态,无需复杂的配置和中间环节。

这种简单易用的 API 降低了开发者的学习成本,让开发者能够更专注于业务逻辑的实现,而不是被状态管理的复杂性所困扰。

(三)强大的扩展能力

Jotai 具有强大的扩展能力,能够满足复杂业务的需求。它可以通过中间件来扩展功能,如处理异步操作、日志记录、状态持久化等。

此外,Jotai 还支持派生状态,开发者可以基于现有原子轻松派生出新的状态,满足复杂的计算和逻辑需求。同时,Jotai 也与其他库和工具具有良好的兼容性,可以与其他状态管理库或框架集成,为开发者提供了更多的灵活性和选择。

例如,在处理复杂的异步数据获取和处理时,通过添加适当的中间件,Jotai 能够有效地管理状态的变化和组件的更新,确保应用的稳定和高效运行。

四、实际应用案例

(一)使用 Zutand 构建购物车应用

假设我们正在构建一个简单的购物车应用。首先,使用 Zutand 创建一个存储购物车物品的状态:

代码语言:javascript
代码运行次数:0
运行
复制
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import create from 'zustand';

const useCartStore = create((set) => ({

items: [],

addItem: (item) => set((state) => ({ items: [...state.items, item] })),

removeItem: (itemId) => set((state) => ({ items: state.items.filter((item) => item.id!== itemId) }))

}));

在组件中,可以这样使用:

代码语言:javascript
代码运行次数:0
运行
复制
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function ShoppingCart() {

const { items, addItem, removeItem } = useCartStore();

return (

<div>

<ul>

{items.map((item) => (

<li key={item.id}>{item.name} <button onClick={() => removeItem(item.id)}>Remove</button></li>

))}

</ul>

<button onClick={() => addItem({ id: 1, name: 'Product 1' })}>Add Product</button>

</div>

);

}
(二)使用 Jotai 实现用户登录状态管理

以用户登录状态的管理为例,使用 Jotai 来实现:

代码语言:javascript
代码运行次数:0
运行
复制
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { atom } from 'jotai';

const isLoggedInAtom = atom(false);

function LoginComponent() {

const [isLoggedIn, setIsLoggedIn] = useAtom(isLoggedInAtom);

const handleLogin = () => setIsLoggedIn(true);

const handleLogout = () => setIsLoggedIn(false);

return (

<div>

{isLoggedIn? 'Logged in' : 'Not logged in'}

<button onClick={handleLogin}>Login</button>

<button onClick={handleLogout}>Logout</button>

</div>

);

}

通过这些实际应用案例,可以清晰地看到 Zutand 和 Jotai 在处理不同业务场景时的高效性和便利性,为开发者提供了简洁且强大的状态管理解决方案。

五、未来展望

(一)技术演进与创新

随着前端技术的不断发展,Zutand 和 Jotai 有望在状态管理的技术层面持续演进和创新。可能会引入更高效的状态更新机制、更智能的依赖追踪算法,以进一步提升性能和响应速度。同时,对于异步操作和错误处理的支持可能会更加完善,使其能够更好地应对复杂的业务场景。

(二)社区与生态发展

强大的社区和丰富的生态对于一个库的发展至关重要。预计 Zutand 和 Jotai 的社区将不断壮大,吸引更多的开发者贡献代码、分享经验和创建相关的扩展插件。这将丰富它们的功能,满足更多个性化的需求。

(三)与新兴技术的融合

在未来,Zutand 和 Jotai 可能会与新兴的前端技术,如 Server Components、WebAssembly 等进行融合,以提供更全面、更强大的解决方案。它们可能会适应新的开发模式和架构,为开发者带来更多的便利和创新的可能性。

(四)在大型项目中的应用

随着功能的增强和稳定性的提高,Zutand 和 Jotai 有望在大型复杂项目中得到更广泛的应用。它们可能会成为大型企业级应用首选的状态管理工具之一,为开发者在处理大规模状态和复杂业务逻辑时提供更可靠的支持。

总之,Zutand 和 Jotai 在未来具有广阔的发展前景,将继续为 React 开发者提供更优质、更高效的状态管理体验。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-08-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
各流派 React 状态管理对比和原理实现
在 React 诞生之初,Facebook 宣传这是一个用于前端开发的界面库。在大型应用中,如何处理好 React 组件通信和状态管理就显得非常重要。
尹光耀
2022/03/22
3.2K0
各流派 React 状态管理对比和原理实现
从 Recoil 到 Jotai (上)
偶然的一次项目开发中发现 Recoil 有内存泄漏的情况,一次几 M ,虽然影响不大,但是还是具有一定的隐患,特别是随着项目的体量增加,后期带来的替换成本也会随之增高;
不换
2024/04/30
2520
从 Recoil 到 Jotai (上)
Flutter Provider 使用指南详解
在Flutter应用程序开发中,状态管理是一个至关重要的方面。随着应用程序的复杂性增加,有效地管理和共享状态变得至关重要。Flutter Provider是一个流行的状态管理解决方案,它提供了一种简单而强大的方式来管理Flutter应用程序中的状态。
繁依Fanyi
2024/03/26
2.2K0
React结合Redux实现Todolist
使用了redux进行状态管理 删除一个用户首先dispatch了一个deleteTodoList的 action  然后在reducer中返回删除后的数据 store更新数据 组件订阅了store的更新后 更新了内部状态 页面更新成功
憧憬博客
2020/07/20
5430
86.HarmonyOS NEXT 组件通信与状态共享:构建高效的组件协作机制
通过合理使用组件通信和状态共享机制,可以构建出结构清晰、易于维护的应用。在实际开发中,要根据具体需求选择合适的通信方式,并注意性能优化和代码质量。
全栈若城
2025/03/16
1140
MobX or Redux?
在过去的项目中一直用的都是 Redux,觉得挺不错的,按照官方推荐的一些写法,再加上团队风格,打造了一套关于 Redux 的架构,但是,现在觉得写 Action、Reducer 太繁琐,随着业务不断的增量,相应的文件和代码也会不断的增加,而且对新人来说不是非常友好(理解 Redux 比较困难),听说一方诸侯 MobX 非常不错,所以在尝试使用了,目前项目中两套架构都是并存,写下自己的一些感想。
发声的沉默者
2021/06/14
6320
MobX or Redux?
深度解析——Vue与React的核心差异
| 维度 | Vue 3 | React 18 |
裕贞
2025/02/17
2410
深度解析——Vue与React的核心差异
使用Redux制作一个TodoList
在组件化开发的 web 前端当中,经常的需要在不同的组件之间进行通信以及一些数据共享,那么我们就需要使用像 Vuex 那样的状态管理工具,在 React 当中,经常使用 Redux 来做状态管理工具。
小小杰啊
2022/12/21
5250
使用Redux制作一个TodoList
依赖追踪?Signal?如果你想要,React 中也能实现
弱侵入性一个比较显著的体现就是,当你觉得你不喜欢 React 自带的 useState、useEffect 时,你可以轻松植入你自己的开发思维。把他调整成为你喜爱的形状。
用户6901603
2024/01/17
4980
依赖追踪?Signal?如果你想要,React 中也能实现
聊聊两个状态管理库 Redux & Recoil
React 是一个十分优秀的UI库, 最初的时候, React 只专注于UI层, 对全局状态管理并没有很好的解决方案, 也因此催生出类似Redux 这样优秀的状态管理工库。
皮小蛋
2020/08/25
3.7K0
聊聊两个状态管理库 Redux & Recoil
JSX return里面如何用if判断
在JSX中,由于不能直接使用传统的JavaScript ​​if​​ 语句,但可以通过条件渲染来实现类似的效果。以下是一些方法:
JaneYork
2024/05/25
2670
Zustand 用法记录
将复杂对象拆分成多个小的状态存储,避免单个存储变得过于庞大。例如,若有一个用户对象包含基本信息、偏好设置和订单信息,可将这些信息拆分成不同的存储。
tonglei0429
2025/03/25
1390
Zustand 用法记录
深入理解 Redux 原理及其在 React 中的使用流程
大家好,我是腾讯云开发者社区的 Front_Yue,随着前端开发技术的不断发展,开发者们越来越注重应用的可维护性、可扩展性和稳定性。而状态管理库 Redux 的出现,为我们的应用提供了一种优雅的状态管理方案。本篇文章将详细介绍 Redux 的原理以及如何在 React 项目中使用 Redux。
Front_Yue
2024/06/10
1.1K0
深入理解 Redux 原理及其在 React 中的使用流程
使用 Taro 框架开发跨端电商应用实践
开始之前推荐一篇实用的文章:MySQL事务大揭秘:事务概述和隔离级别解析原创 ,该文通过深入浅出的说明讲解了MYSQL事务的特征、控制语句、生命周期等基础内容,也讲解了ACID特性的各项内容,能够很好的理解MYSQL事务。
lyushine
2024/12/02
2780
如何在 React 应用中使用 Hooks、Redux 等管理状态
大家好,我是若川。持续组织了近一年的源码共读活动,感兴趣的可以 点此扫码加我微信 ruochuan12 参与,每周大家一起学习200行左右的源码,共同进步。同时极力推荐订阅我写的《学习源码整体架构系列》 包含20余篇源码文章。历史面试系列。另外:目前建有江西|湖南|湖北籍前端群,可加我微信进群。
若川
2022/11/11
9.1K0
如何在 React 应用中使用 Hooks、Redux 等管理状态
Redux(一):基本概念
React是一个单向数据流的view层框架,单向数据流、组件化、生命周期是其特点。在React组件关系中,组件状态由自己管理,父子组件通过props传递;兄弟组件那么就需要一个共同的父组件作中转;如果涉及层级比较深的话一层一层传递会非常麻烦。所以大量状态共享是React单独难以解决的问题。
Ashen
2020/06/01
1.4K0
从前端视角看 SwiftUI
我对 iOS 开发、手机开发、SwiftUI 开发经验有限,若有理解错误的部分欢迎指正。
Swift社区
2022/02/09
3.7K0
如何提高redux开发效率?当然是redux-tookit啦!
使用 react-redux 的朋友都经历过这种痛苦吧? 定义一个 store 仓库,首先创建各种文件,比如 reducer、action、store...,然后 将 redux 和 react 连接使用。整个流程繁琐,写起来代码冗余。 react-redux 创建仓库,文件目录如下:
程序员王天
2023/10/18
4310
如何提高redux开发效率?当然是redux-tookit啦!
React useReducer 终极使用教程
useReducer 是在 react V 16.8 推出的钩子函数,从用法层面来说是可以代替useState。相信前期使用过 React 的前端同学,大都会经历从 class 语法向 hooks 用法的转变,react 的 hooks 编程给我们带来了丝滑的函数式编程体验,同时很多前端著名的文章也讲述了 hooks 带来的前端心智的转变,这里就不再着重强调,本文则是聚焦于 useReducer 这个钩子函数的原理和用法,笔者带领大家再一次深入认识 useReducer。
蒋川@卡拉云
2022/08/31
4K0
React useReducer 终极使用教程
Zustand:让React状态管理更简单、更高效
在React项目开发中,状态管理一直是一个绕不开的话题。很多人提到状态管理,第一时间会想到Redux。Redux作为一个历史悠久的库,确实在功能性和中间件生态方面都有着不错的表现,但它复杂的配置和繁琐的代码书写让许多开发者望而却步。
前端达人
2024/03/27
1.9K0
Zustand:让React状态管理更简单、更高效
相关推荐
各流派 React 状态管理对比和原理实现
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验