【React】状态管理之Zustand

ops/2024/11/17 18:08:40/

鑫宝Code

🌈个人主页: 鑫宝Code
🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础
💫个人格言: "如无必要,勿增实体"


文章目录

  • 状态管理之Zustand
    • 引言
    • 1. Zustand 的核心特点
      • 1.1 简单直观的 API
      • 1.2 无需 Provider
    • 2. 高级特性与用法
      • 2.1 异步操作处理
      • 2.2 中间件支持
      • 2.3 状态切片(Slices)
    • 3. 性能优化
      • 3.1 选择性订阅
      • 3.2 浅比较
    • 4. 实际应用场景
      • 4.1 表单状态管理
      • 4.2 认证状态管理
    • 5. 最佳实践
      • 5.1 Store 组织
      • 5.2 TypeScript 集成
    • 总结

状态管理之Zustand

在这里插入图片描述

引言

Zustand 是一个轻量级的状态管理库,以其简单、灵活和高性能的特点在 React 社区中快速崛起。本文将深入探讨 Zustand 的核心概念、使用方法和最佳实践。

1. Zustand 的核心特点

1.1 简单直观的 API

Zustand 采用极简的 API 设计,创建 store 非常简单:

import create from 'zustand'interface BearStore {bears: numberincrease: () => voiddecrease: () => void
}const useStore = create<BearStore>((set) => ({bears: 0,increase: () => set((state) => ({ bears: state.bears + 1 })),decrease: () => set((state) => ({ bears: state.bears - 1 }))
}))

1.2 无需 Provider

与 Redux 和 Context API 不同,Zustand 不需要 Provider 包裹:

function BearCounter() {const bears = useStore((state) => state.bears)return <h1>{bears} around here...</h1>
}function Controls() {const increase = useStore((state) => state.increase)const decrease = useStore((state) => state.decrease)return (<div><button onClick={increase}>+</button><button onClick={decrease}>-</button></div>)
}

2. 高级特性与用法

在这里插入图片描述

2.1 异步操作处理

interface TodoStore {todos: Todo[]loading: booleanfetchTodos: () => Promise<void>
}const useTodoStore = create<TodoStore>((set) => ({todos: [],loading: false,fetchTodos: async () => {set({ loading: true })try {const response = await fetch('https://api.example.com/todos')const todos = await response.json()set({ todos, loading: false })} catch (error) {set({ loading: false })console.error(error)}}
}))

2.2 中间件支持

Zustand 提供了强大的中间件支持:

import { persist, devtools } from 'zustand/middleware'const useStore = create(devtools(persist((set) => ({bears: 0,increase: () => set((state) => ({ bears: state.bears + 1 }))}),{ name: 'bear-storage' }))
)

2.3 状态切片(Slices)

组织大型应用状态:

interface AuthSlice {user: User | nulllogin: (credentials: Credentials) => Promise<void>logout: () => void
}interface TodoSlice {todos: Todo[]addTodo: (todo: Todo) => void
}const createAuthSlice = (set) => ({user: null,login: async (credentials) => {const user = await loginApi(credentials)set({ user })},logout: () => set({ user: null })
})const createTodoSlice = (set) => ({todos: [],addTodo: (todo) => set((state) => ({ todos: [...state.todos, todo] }))
})const useStore = create((set) => ({...createAuthSlice(set),...createTodoSlice(set)
}))

3. 性能优化

3.1 选择性订阅

Zustand 支持细粒度的状态订阅:

function TodoCount() {// 只在 todos.length 变化时重渲染const todoCount = useStore((state) => state.todos.length)return <div>Todo Count: {todoCount}</div>
}

3.2 浅比较

使用 shallow 进行浅比较:

import shallow from 'zustand/shallow'function TodoList() {const { todos, addTodo } = useStore((state) => ({ todos: state.todos, addTodo: state.addTodo }),shallow)return (// 组件实现)
}

4. 实际应用场景

4.1 表单状态管理

interface FormStore {formData: {name: stringemail: string}setField: (field: string, value: string) => voidresetForm: () => void
}const useFormStore = create<FormStore>((set) => ({formData: {name: '',email: ''},setField: (field, value) => set((state) => ({formData: {...state.formData,[field]: value}})),resetForm: () => set({formData: {name: '',email: ''}})
}))

4.2 认证状态管理

interface AuthStore {token: string | nulluser: User | nulllogin: (credentials: Credentials) => Promise<void>logout: () => voidupdateUser: (user: Partial<User>) => void
}const useAuthStore = create<AuthStore>()(persist((set) => ({token: null,user: null,login: async (credentials) => {const { token, user } = await loginApi(credentials)set({ token, user })},logout: () => set({ token: null, user: null }),updateUser: (userData) =>set((state) => ({user: state.user ? { ...state.user, ...userData } : null}))}),{name: 'auth-storage',getStorage: () => localStorage})
)

5. 最佳实践

5.1 Store 组织

// stores/index.ts
import { useAuthStore } from './authStore'
import { useTodoStore } from './todoStore'
import { useUIStore } from './uiStore'export {useAuthStore,useTodoStore,useUIStore
}

5.2 TypeScript 集成

// types.ts
interface Todo {id: stringtitle: stringcompleted: boolean
}interface TodoState {todos: Todo[]loading: booleanerror: string | nulladdTodo: (title: string) => voidtoggleTodo: (id: string) => voidremoveTodo: (id: string) => void
}// todoStore.ts
const useTodoStore = create<TodoState>((set) => ({todos: [],loading: false,error: null,addTodo: (title) => set((state) => ({todos: [...state.todos,{id: Date.now().toString(),title,completed: false}]})),toggleTodo: (id) =>set((state) => ({todos: state.todos.map((todo) =>todo.id === id? { ...todo, completed: !todo.completed }: todo)})),removeTodo: (id) =>set((state) => ({todos: state.todos.filter((todo) => todo.id !== id)}))
}))

总结

在这里插入图片描述

Zustand 的优势在于:

  • 简单直观的 API 设计
  • 无需 Provider 的使用方式
  • 出色的 TypeScript 支持
  • 强大的中间件系统
  • 优秀的性能表现

使用 Zustand 可以帮助我们:

  1. 降低状态管理的复杂度
  2. 提高应用的可维护性
  3. 优化应用性能
  4. 提供更好的开发体验

在选择状态管理方案时,如果你需要一个轻量级但功能强大的解决方案,Zustand 是一个值得考虑的选择。它特别适合中小型应用,但通过良好的状态组织,同样可以胜任大型应用的状态管理需求。

End


http://www.ppmy.cn/ops/134489.html

相关文章

【Linux篇】面试——用户和组、文件类型、权限、进程

目录 一、权限管理 1. 用户和组 &#xff08;1&#xff09;相关概念 &#xff08;2&#xff09;用户命令 ① useradd&#xff08;添加新的用户账号&#xff09; ② userdel&#xff08;删除帐号&#xff09; ③ usermod&#xff08;修改帐号&#xff09; ④ passwd&…

idea 添加内嵌代码作者-方法添加作者-设置方法作者-设置[code author]--设置代码修改作者和修改时间

这个设置还是有点难的。在网络上资料比较少&#xff0c;找了好久才找到&#xff0c;这里记录一下。 当团队合作编辑代码时&#xff0c;代码中方法的添加修改设置作者和修改时间很重要。 具体方法&#xff1a; 这里大体原理就是&#xff0c;显示的作者是git配置的用户账户信息…

删库跑路,启动!

起因&#xff1a;这是一个悲伤的故事&#xff0c;在抓logcat时 device待机自动回根目录了&#xff0c;而题主对当前路径的印象还停留在文件夹下&#xff0c;不小心在根目录执行了rm -rf * … 所以&#xff0c;这是个悲伤的故事&#xff0c;东西全没了…device也黑屏了&#xff…

uniapp中h5端如何引用本地json数据(json文件)

前言 uniapp读取本地json数据文件&#xff0c;有下面两种方式可以实现&#xff1a; 文件后缀为.json类型文件后缀为.js类型 这里展示后缀为.js类型的处理方式 1、在static中创建后缀为.js的文件存储json数据。 注意使用export导出 2、在要使用的页面导入 <template>…

高光谱深度学习调研

综述 高光谱深度学习只有小综述&#xff0c;没有大综述。小综述里面场景分类、目标检测的综述比较多。 Wang C, Liu B, Liu L, et al. A review of deep learning used in the hyperspectral image analysis for agriculture[J]. Artificial Intelligence Review, 2021, 54(7)…

CentOS8 启动错误,enter emergency mode ,开机直接进入紧急救援模式,报错 Failed to mount /home 解决方法

先看现场问题截图&#xff1a; 1.根据提示 按 ctrld 输入 root 密码&#xff0c;进入系统。 2. 在紧急模式下运行&#xff1a;journalctl -xe &#xff0c;查看相关日志&#xff0c;找到关键点&#xff1a; Failed to mount /home 3.接着执行修复命令&#xff1a; xfs_repa…

人工智能技术的应用前景及其对生活和工作方式的影响

人工智能技术的应用前景及其对生活和工作方式的影响 随着人工智能技术的不断发展&#xff0c;我们已经见证了它在各个行业带来的巨大变革。从医疗诊断到企业运营&#xff0c;从日常生活到科技创新&#xff0c;人工智能正以其独特的方式改变着我们的世界。本文将探讨人工智能技…

塑料薄膜厂需要用到哪些自动化备件

塑料薄膜厂在生产过程中&#xff0c;同样会依赖多种自动化备件来确保生产线的稳定运行和高效产出。以下是一些塑料薄膜厂常用的自动化备件&#xff1a; 上料与输送设备&#xff1a; 自动上料机&#xff1a;如塑料颗粒自动上料机、色母分选与称重机等&#xff0c;用于将原料自动…