当前位置: 首页 > news >正文

react+Zustand来管理公共数据,类似vue的pinia

前言:

        在react中,我们常用的状态管理工具就是redux,像他的官方提供的工具redux Toolkit 已经很简洁,好用了,除了这个之外的话,还有出现的Zustand也能简洁高效的管理我们的公共数据,相比较redux的官方工具更简洁,类似我们vue3出来的pinia的工具,定位是一样的,这里来说一说他。

Zustand 与 Redux(及 Redux Toolkit)对比

维度ZustandRedux
定位轻量级状态管理(单 store)企业级状态管理(支持复杂场景)
学习曲线极简 API,上手快概念较多(action/reducer/middleware)
不可变性默认可变(类似 Vuex)严格不可变(需返回新状态)
模板代码几乎为零Redux 较多,Redux Toolkit 减少
特性ZustandRedux
Store 数量多个独立 store单一 store,模块化通过 slices
更新机制直接调用 set 方法必须 dispatch(action)
性能优化自动选择组件所需状态需手动优化(如 shallowEqual)
中间件支持(如持久化、日志)生态强大(redux-thunk/saga 等)
DevTools需手动集成默认支持
TypeScript 支持极佳优秀(Redux Toolkit 更完善)

具体使用:

1、安装 
npm i zustand
2、简洁使用

store/index.js

import create from 'zustand';export const useCounterStore = create((set) => ({//定义变量count: 0,//定义方法,直接修改变量内容increment: () => set((state) => ({ count: state.count + 1 })), reset: () => set({ count: 0 }),}));

界面jsx中

import { useCounterStore } from '@/store'//定义好的变量和事件,直接就能取到
const { count, increment } = useCounterStore(); //用的时候,直接{}就能拿到,跟普通变量一样,事件也是直接就能调用
return <button onClick={increment}>{count}</button>;
3、项目正常使用,使用中级件

immer 和 persistZustand常用的中间件

immer 直接修改状态(类似 Vue 或 MobX 的写法),而 不需要手动返回新状态

(你的状态结构较复杂(如嵌套对象、数组)时,避免手写 ...spread 或 Object.assign

 persist持久化到本地存储,刷新后丢失

immer 的具体使用方法

可以看到,immer方法里面也可以直接写变量和事件,同步异步都一样

入参是set和get,set修改变量,get获取变量内容和调用其它定义的方法

mport { create } from 'zustand';
import { immer } from 'zustand/middleware/immer';// 使用 immer 中间件
const useTodoStore = create(immer((set) => ({ //set可以简写不要括号// 定义变量todos: [],// 定义方法addTodo: (text) =>set((state) => {state.todos.push({ text, done: false });}),}))
);
persist 的具体使用方法

1、persist有两个参数,第一个是回调函数,入参两个,set可以修改定义的变量,get可以获取调用当前定义好的变量与事件,第二个是缓存的配置

2、定义变量和方法直接在里面写就行了,不用initialState、reducers这种定义方法

3、异步方法和同步方法的区别直接是可以用async来定义异步,await来掉接口,同步就是方法里写逻辑,其它没区别

import { create } from 'zustand';
import { persist } from 'zustand/middleware';
import { loginApi } from '@/api/test'//封装的axios请求方法// 使用 persist 中间件
const useAuthStore = create(persist((set,get) => ({// 定义的变量user: null,token:'',// 定义的事件  login: (userData) => set({ user: userData }),//set方法直接修改变量内容,不用stategetToken: async () => {get().login() //可以通过这种方式,调用其它方法// 异步调用接口const res = await loginApi(form)set((state) => {state.token = res.tokenstate.user = res})},}),{name: 'auth-storage', // localStorage 的 keygetStorage: () => localStorage, // 默认是 localStorage// 可选:只持久化部分字段partialize: (state) => ({ user: state.user,token: state.token }),})
);
4、源码分享

当 immer和 persist 同时使用,immer放外面,persist放里面,参数还是 set和get

import { create } from 'zustand'
import { immer } from 'zustand/middleware/immer'
import { persist } from 'zustand/middleware'
import { useTabbarStore } from './tabbar'
import { useMenuStore } from './menu'
import { STORAGE_PREFIX, USER } from '@/config/cache'
import { loginApi, logoutApi } from '@/api/test'interface IState {token: stringuserInfo: any
}interface IActions {init: () => voidlogin: (form: any) => Promise<void>logout: () => Promise<void>
}export const useUserStore = create<IState & IActions>()(immer(persist((set, get) => ({token: '',userInfo: {},init: () => {useMenuStore.getState().init()useTabbarStore.getState().init()set((state) => {state.token = ''state.userInfo = {}})},login: async (form) => {get().init()const res = await loginApi(form)set((state) => {state.token = res.tokenstate.userInfo = res})},logout: async () => {await logoutApi().then(() => {get().init()})},}), {name: `${STORAGE_PREFIX}${USER}`,partialize: state => ({ token: state.token, userInfo: state.userInfo }),}),),
)

http://www.dtcms.com/a/328027.html

相关文章:

  • React 腾讯面试手写题
  • Orange的运维学习日记--40.LNMP-LAMP架构最佳实践
  • 【前端:Html】--3.进阶:图形
  • [激光原理与应用-252]:理论 - 几何光学 - 传统透镜焦距固定,但近年出现的可变形透镜(如液态透镜、弹性膜透镜)可通过改变自身形状动态调整焦距。
  • 虚拟机环境部署Ceph集群的详细指南
  • 「让AI大脑直连Windows桌面」:深度解析Windows-MCP,开启操作系统下一代智能交互
  • Hi3DEval:以分层有效性推进三维(3D)生成评估
  • 【树状数组】Range Update Queries
  • 《Leetcode》-面试题-hot100-栈
  • Apache SeaTunnel 新定位!迈向多模态数据集成的统一工具
  • 亚马逊与UPS规则双调整:从视觉营销革新到物流成本重构的运营战略升级
  • linux下安装php
  • Linux内核编译ARM架构 linux-6.16
  • Node.js 和 npm 的关系详解
  • 能刷java题的网站
  • FPGA即插即用Verilog驱动系列——按键消抖
  • 【JavaEE】多线程之线程安全(中)
  • 第5章 AB实验的随机分流
  • 圆柱电池自动分选机:新能源时代的“质量卫士”
  • 各版本IDEA体验
  • Next.js 中间件:自定义请求处理
  • LeetCode 分割回文串
  • 终端互动媒体业务VS终端小艺业务
  • 本地部署开源媒体中心软件 Kodi 并实现外部访问( Windows 版本)
  • Perl——文件操作
  • 工业相机终极指南:驱动现代智能制造的核心“慧眼”
  • 云原生作业(tomcat)
  • 优选算法 力扣 18. 四数之和 双指针算法的进化 优化时间复杂度 C++ 题解 每日一题
  • Perl——$_
  • Bevy渲染引擎核心技术深度解析:架构、体积雾与Meshlet渲染