Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >放弃Redux吧,转投Zustand吧

放弃Redux吧,转投Zustand吧

作者头像
用户6297767
发布于 2024-04-01 00:34:15
发布于 2024-04-01 00:34:15
69600
代码可运行
举报
运行总次数:0
代码可运行

Zustand是什么

Zustand 是一个为 React 应用程序设计的开源状态管理库,它旨在提供一种简单、轻量级且易于使用的方式来管理应用程序的状态。它是由 Max Stoiber 创建的,并且得到了社区的广泛支持和使用。

Zustand 的核心思想是将状态管理与组件分离,从而使得状态管理更加集中化,同时保持了 React 的响应性和组件的可重用性。它提供了一种简单的 API,使得开发者能够轻松地在应用程序中的任何地方访问和修改状态。 使用 Zustand,开发者可以通过创建一个 store 来存储和管理应用程序的状态。这个 store 是通过调用 createStore 方法并传入一个包含状态和操作的 object 来创建的。

Zustand 与其他状态管理库 如 Redux 和 MobX 相比有什么优势?

Zustand 是一个为 React 应用程序设计的状态管理库,与其他流行的状态管理库如 Redux 和 MobX 相比,它提供了一些独特的优势和特性。以下是 Zustand 相对于 Redux 和 MobX 的一些主要优势:

1. 简单性和易用性

Zustand 提供了一个非常简单和直观的 API,使得开发者能够轻松地创建和管理状态。与 Redux 相比,Zustand 不需要定义复杂的 reducer、action 类型和 action 创建器。与 MobX 相比,Zustand 避免了使用装饰器和 Proxy,使得代码更加直观和易于理解。

2. 集成和兼容性

Zustand 与 React 的集成非常紧密,它利用了 React 的上下文和钩子系统来提供状态管理功能。这意味着在使用 React 应用程序时,Zustand 可以无缝地与现有的组件和钩子一起工作。此外,Zustand 还支持 React Concurrent 模式,确保在最新的 React 版本中也能正常工作。

3. 性能优化

Zustand 通过自动缓存状态值来减少不必要的组件渲染,从而提高性能。它还解决了 Redux 中的“死节点”问题,即在某些情况下,子组件可能无法正确更新的问题。此外,Zustand 通过使用 React 的上下文和钩子系统,避免了 Context loss 问题,这在某些复杂的组件结构中可能会出现。

4. 中间件支持

Zustand 支持大量的中间件,如 Immer、Redux 中间件等,这使得开发者可以根据需要轻松地扩展 Zustand 的功能。这些中间件可以帮助处理不可变状态的更新、异步操作等复杂场景。

5. 状态共享和访问

Zustand 使得在应用程序的任何地方共享和访问状态变得非常容易。开发者可以使用 useStore 钩子来获取和更新状态,而不需要通过多层的组件传递 props 或者使用 React Context。

6. 调试和开发体验

Zustand 提供了良好的调试体验,它与 Redux DevTools 兼容,使得开发者可以轻松地检查和调试状态变化。此外,Zustand 还提供了一些内置的调试功能,如 useDebugValue 钩子,可以帮助开发者更好地理解状态的变化。

7. 灵活性和可扩展性

Zustand 允许开发者通过自定义钩子和中间件来扩展其功能。这意味着开发者可以根据项目的具体需求来定制状态管理的行为,从而获得更高的灵活性和可扩展性。

总的来说,Zustand 通过其简单、高效和与 React 紧密集成的特性,为 React 应用程序的状态管理提供了一个优秀的解决方案。它的易用性、性能优化、中间件支持和良好的调试体验使其成为了许多开发者在构建 React 应用程序时的首选状态管理库。

如何使用Zustand

1. 安装 Zustand

首先,你需要安装 Zustand 库。可以通过 npm 或 yarn 来安装:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
npm install zustand
# 或者
yarn add zustand
2. 创建一个 store

使用 create 方法创建一个新的 Zustand store。store 是状态的容器,你可以在其中定义状态和与之相关的操作。

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

const useStore = create(set => ({
  count: 0,
  increment: () => set(state => ({ count: state.count + 1 })),
  decrement: () => set(state => ({ count: state.count - 1 })),
}))
3. 在组件中使用 store

在你的 React 组件中,使用 useStore 钩子来访问和更新 store 中的状态。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { useStore } from './store'

function Counter() {
  const { count, increment, decrement } = useStore()

  return (
    <div>
      <h2>Counter: {count}</h2>
      <button onClick={increment}>Increment</button>
      <button onClick={decrement}>Decrement</button>
    </div>
  )
)

高级特性

使用中间件

Zustand 支持中间件,你可以使用它来处理异步操作、实现不可变性等。

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

const useStore = create(
  immer(set => ({
    items: [],
    addItem: (item) => set(produce((draft) => { draft.items.push(item) })),
  })),
  { middleware: [immer] }
)
与 React Context 集成

Zustand 可以与 React Context 集成,使得在组件树中共享状态更加容易。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { createContext, useContext } from 'react'
import { useStore } from './store'

const StoreContext = createContext(null)

function App() {
  const store = useStore()
  return (
    <StoreContext.Provider value={store}>
      {/* 应用程序的其他部分 */}
    </StoreContext.Provider>
  )
}

function Component() {
  const store = useContext(StoreContext)
  // 使用 store ...
}
监听状态变化

你可以订阅 store 的变化,以便在状态变化时执行某些操作。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const unsubscribe = useStore.subscribe(() => {
  console.log('State changed!')
})

// 当不再需要监听时,取消订阅
unsubscribe()
清理和销毁 store

在某些情况下,你可能需要清理或销毁 store。Zustand 提供了 destroy 方法来实现这一点。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const store = useStore()
// 当组件卸载时,清理 store
store.destroy()
使用自定义钩子

你可以创建自定义钩子来封装 store 的某些操作,使得在组件中使用更加方便。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const useIncrement = () => useStore(state => state.increment)

function Button() {
  const increment = useIncrement()
  return <button onClick={increment}>Increment</button>
}
处理异步操作

Zustand 允许你处理异步操作,并在操作完成后更新状态。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const useStore = create(set => ({
  data: null,
  loading: false,
  error: null,
  fetchData: async () => {
    set(state => ({ loading: true }))
    try {
      const response = await fetch('/api/data')
      const data = await response.json()
      set(state => ({ data, loading: false }))
    } catch (error) {
      set(state => ({ error, loading: false }))
    }
  },
}))

通过这些基本步骤和高级特性,可以开始在 React 应用程序中使用 Zustand 来管理状态。

Zustand 的设计旨在提供一种简单、高效且易于理解的方式来处理状态,无论是对于新手还是有经验的开发者,都是一个很好的状态管理库。

我的上一篇文章两种最简单的方式教会你如何实现前端一键换肤!其实可以使用状态管理来管理全局的主题样式,然后再配合zustand的持久化插件persist来实现一键换肤的功能,这样刷新之后也不会丢失状态了

persist持久化的用法

Zustand 的持久化插件是一个强大的功能,它允许你将状态保存在客户端的 localStoragesessionStorage 中。这意味着即使在页面刷新或关闭后,状态也能够被保留和恢复。这个功能对于那些需要持久保存用户操作的场景非常有用,比如表单数据、用户偏好设置等。

如何使用持久化插件

要使用 Zustand 的持久化功能,你需要先从 zustand 库中导入 persist 中间件。然后,你可以将这个中间件应用到你的 store 创建函数中。

以下是一个简单的例子,展示了如何使用 persist 中间件来持久化一个 store 中的状态:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import create from 'zustand'
import { persist } from 'zustand/middleware'

// 定义你的 store 结构和操作
const useSettingsStore = create(
  persist(
    (set) => ({
      theme: 'light',
      setTheme: (theme) => set((state) => ({ theme })),
    }),
    {
      // 持久化配置项
      key: 'settings', // localStorage 中的 key 值
      whitelist: ['theme'], // 只持久化 theme 状态
      blacklist: [], // 不持久化任何状态
      debug: false, // 是否在控制台输出调试信息
    }
  )
)

// 现在你可以在组件中使用 useSettingsStore 钩子来访问和修改状态
// 状态变化后,它将自动保存到 localStorage 中

在上面的代码中,我们创建了一个名为 useSettingsStore 的 store,其中包含一个 theme 状态和一个 setTheme 操作。我们使用 persist 中间件来持久化这个 store,并设置了 key'settings',这样 localStorage 中就会有一个与之对应的键值对。

持久化配置项

persist 中间件接受一个配置对象,你可以在这个对象中定义持久化的行为:

  • key: 存储在 localStoragesessionStorage 中的键名。
  • whitelist: 一个数组,指定哪些状态应该被持久化。只有包含在数组中的状态才会被保存。
  • blacklist: 一个数组,指定哪些状态不应该被持久化。这是一个取反的 whitelist
  • debug: 一个布尔值,如果设置为 true,则会在控制台输出额外的调试信息。

自定义持久化中间件

如果你需要更细粒度的控制或者想要创建自己的持久化逻辑,你可以通过创建自定义中间件来实现。例如,你可以创建一个中间件来处理特定的存储逻辑或者在持久化前后执行额外的操作。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const myCustomPersist = (set, get, store) => {
  // 自定义持久化逻辑
  const originalSet = store.setState
  store.setState = (update, ...args) => {
    // 在更新状态之前或之后执行一些操作
    const result = originalSet(update, ...args)
    // 持久化状态
    // ...
    return result
  }
}

// 使用自定义持久化中间件
const useCustomStore = create(
  myCustomPersist(
    set => ({
      // 状态和操作
    })
  )
)

通过使用 Zustand 的持久化插件,你可以轻松地将状态保存在客户端存储中,从而提供更好的用户体验和更健壮的应用程序状态管理。这个功能特别适用于那些需要跨会话或页面刷新保持状态的场景。

总结

以上就是zustand的全部用法了。已经简单阐述了一下为什么要选zustand而不是继续用redux。

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

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Zustand:让React状态管理更简单、更高效
在React项目开发中,状态管理一直是一个绕不开的话题。很多人提到状态管理,第一时间会想到Redux。Redux作为一个历史悠久的库,确实在功能性和中间件生态方面都有着不错的表现,但它复杂的配置和繁琐的代码书写让许多开发者望而却步。
前端达人
2024/03/27
1.7K0
Zustand:让React状态管理更简单、更高效
精读《zustand 源码》
zustand 是一个非常时髦的状态管理库,也是 2021 年 Star 增长最快的 React 状态管理库。它的理念非常函数式,API 设计的很优雅,值得学习。
黄子毅
2022/03/15
1.4K0
Zustand 用法记录
将复杂对象拆分成多个小的状态存储,避免单个存储变得过于庞大。例如,若有一个用户对象包含基本信息、偏好设置和订单信息,可将这些信息拆分成不同的存储。
tonglei0429
2025/03/25
1010
Zustand 用法记录
Redux Toolkit:简化Redux应用状态管理
Redux Toolkit 是官方推荐用来简化Redux开发的工具集。它包含了一些预设的最佳实践,使得创建和管理Redux状态变得更简单。
天涯学馆
2024/08/16
2870
学习react-redux,看这篇文章就够啦!
在 Redux 中,reducer 函数是用来处理状态(state)的函数。它接收两个参数:当前的状态(state)和被分发的 action,然后根据 action 的类型来更新状态并返回新的状态对象。
程序员王天
2023/10/18
6240
原子化状态管理库 Jotai,它和 Zustand 有啥区别?
用 createContext 创建了 context,其中保存了 2 个useState 的 state 和 setState 方法。
神说要有光zxg
2024/04/17
8790
原子化状态管理库 Jotai,它和 Zustand 有啥区别?
2023再谈前端状态管理
状态是表示组件当前状况的 JS 对象。在 React 中,可以使用 useState 或者 this.state 维护组件内部状态,通过 props 传递给子组件使用。
zz_jesse
2023/08/21
1.1K0
2023再谈前端状态管理
如何在 React 应用中使用 Hooks、Redux 等管理状态
大家好,我是若川。持续组织了近一年的源码共读活动,感兴趣的可以 点此扫码加我微信 ruochuan12 参与,每周大家一起学习200行左右的源码,共同进步。同时极力推荐订阅我写的《学习源码整体架构系列》 包含20余篇源码文章。历史面试系列。另外:目前建有江西|湖南|湖北籍前端群,可加我微信进群。
若川
2022/11/11
8.9K0
如何在 React 应用中使用 Hooks、Redux 等管理状态
Vue3之状态管理:Vuex和Pinia,孰强孰弱?
在前端开发中,状态管理器是一种用于管理应用程序全局状态的工具。它通常用于大型应用程序,可以帮助开发者更好地组织和管理状态,并提供一些强大的工具来简化状态的变更和使用。
用户6297767
2023/11/21
2.6K0
Vue3之状态管理:Vuex和Pinia,孰强孰弱?
56. 精读《重新思考 Redux》
《重新思考 Redux》是 rematch 作者 Shawn McKay 写的一篇干货软文。
黄子毅
2022/03/14
5080
React redux
Redux是一个JavaScript状态管理库,它可以与任何JavaScript应用程序一起使用,不仅限于React。Redux基于单一状态树的概念,应用程序的所有状态都保存在一个对象中。通过使用Redux,可以以一种可预测和可维护的方式管理应用程序的状态,并使用纯函数来处理状态的变化。
堕落飞鸟
2023/05/20
1.4K0
问:你是如何进行react状态管理方案选择的?
前言:最近接触到一种新的(对我个人而言)状态管理方式,它没有采用现有的开源库,如redux、mobx等,也没有使用传统的useContext,而是用useState + useEffect写了一个发布订阅者模式进行状态管理,这一点对我来说感觉比较新奇,以前从没接触过这种写法,于是决定研究一下目前比较常用的状态管理方式。
beifeng1996
2022/10/10
3.6K0
实现redux
上面实现了兄弟组件的通信,但是复用性差,而且store里的listeners不应该被外界修改。
一粒小麦
2019/07/18
7980
实现redux
忘掉 Redux,拥抱 Zutand 和 Jotai 的全新世界
首先,Redux 的心智负担较重。它涉及到众多概念,如 Store、Reducer、Action 等,对于初学者来说,理解和掌握这些概念需要花费较多的时间和精力。而且,Redux 要求严格遵循其特定的架构和模式,这在一定程度上限制了开发者的灵活性,增加了开发的复杂性。
井九
2024/10/12
1810
忘掉 Redux,拥抱 Zutand 和 Jotai 的全新世界
redux、mobx、concent特性大比拼, 看后生如何对局前辈
redux、mobx本身是一个独立的状态管理框架,各自有自己的抽象api,以其他UI框架无关(react, vue...),本文主要说的和react搭配使用的对比效果,所以下文里提到的redux、mobx暗含了react-redux、mobx-react这些让它们能够在react中发挥功能的绑定库,而concent本身是为了react贴身打造的开发框架,数据流管理只是作为其中一项功能,附带的其他增强react开发体验的特性可以按需使用,后期会刨去concent里所有与react相关联的部分发布concent-core,它的定位才是与redux、mobx 相似的。
腾讯新闻前端团队
2020/04/06
4.7K0
redux、mobx、concent特性大比拼, 看后生如何对局前辈
Redux Toolkit
使用 React 和 Redux 启动新应用程序的推荐方法是使用官方 Redux+JS 模板或Redux+TS 模板来创建 React App,它利用了Redux Toolkit和 React Redux 与 React 组件的集成。
世间万物皆对象
2024/03/20
2300
前端react面试题总结
如果您尝试直接改变组件的状态,React 将无法得知它需要重新渲染组件。通过使用setState()方法,React 可以更新组件的UI。
beifeng1996
2022/10/29
2.7K0
React-全局状态管理的群魔乱舞
而从根本上讲,「React 是一个用于构建用户界面的 JavaScript 库」。
前端柒八九
2022/08/25
3.9K0
React-全局状态管理的群魔乱舞
美团前端react面试题汇总
服务端渲染是数据与模版组成的html,即 HTML = 数据 + 模版。将组件或页面通过服务器生成html字符串,再发送到浏览器,最后将静态标记"混合"为客户端上完全交互的应用程序。页面没使用服务渲染,当请求页面时,返回的body里为空,之后执行js将html结构注入到body里,结合css显示出来;
goClient1992
2022/09/13
5.4K0
【React】211- 2019 React Redux 完全指南
https://juejin.im/post/5cac8ccd6fb9a068530111c7
pingan8787
2019/07/23
4.4K0
【React】211- 2019 React Redux 完全指南
相关推荐
Zustand:让React状态管理更简单、更高效
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验