React状态管理之Zustand

相信许多小伙伴学习React的时候,接触的第一个状态管理库是Redux,但是这个库有非常多的钩子函数,非常难记,偶然发现一个Zustand库,对开发者非常友好。

前言

1. Zustand 是什么?

Zustand 是一个轻量级、灵活且直观的 React 状态管理库。相较于 Redux,它的 API 更简单,减少了样板代码,并提供了良好的开发体验。Zustand 适用于管理全局状态,特别适合小型或中型项目。

2. 为什么选择 Zustand?

  • 简单易用:只需几行代码即可创建状态存储。
  • 无样板代码 :不需要像 Redux 那样定义 reduceraction,直接操作 state
  • 性能优秀 :采用浅比较和 React.useSyncExternalStore,避免不必要的重新渲染。
  • 支持中间件 :提供 persistdevtoolsimmer 等中间件,扩展性强。

3.官方文档

zustand-demo.pmnd.rs/

安装

bash 复制代码
pnpm i zustand

使用

简易计数器

ts 复制代码
import { create } from 'zustand'

type Store = {
  count: number
  inc: () => void
}

const useStore = create<Store>()((set) => ({
  count: 1,
  inc: () => set((state) => ({ count: state.count + 1 })),
}))

function Counter() {
  const { count, inc } = useStore()
  return (
    <div>
      <span>{count}</span>
      <button onClick={inc}>one up</button>
    </div>
  )
}

异步状态更新

首先模拟一个网络请求

ts 复制代码
const fetchMockCount = (delay: number): Promise<number> => {
  return new Promise((resolve) => {
    setTimeout(() => {
      // 模拟异步请求返回固定值
      resolve(666);
    }, delay);
  });
};

create函数后添加action

ts 复制代码
const useStore = create<Store>()((set) => ({
  ...
  // 添加异步函数
  fetchAsyncCount: async (delay: number) => {
    try {
      const data = await fetchMockCount(delay);
      set({ count: data });
    } catch (error) {
      console.error("Failed to fetch count:", error);
    }
  }
}))

调用请求:

ts 复制代码
const { fetchAsyncCount } = useCountStore();
function Test() {
  return (
    <>
      <button onClick={() => fetchAsyncCount(1000)}>获取异步数据</button>
    </>
  );
}

持久化存储

导入presist中间件

ts 复制代码
import { persist,createJSONStorage } from 'zustand/middleware'

将之前create函数后的(set)=>void放入presist中间件中

ts 复制代码
create<Store>()(
	persist((set)=>{
        // 一些逻辑
        count: 0,
        increase(){
            
        },
    },{
        name: "countStorage",
        storage: createJSONStorage(() => sessionStorage),
    })
)

storage不填写默认为localStorage,可自定义为sessionStorage

相关推荐
丫头,冲鸭!!!1 小时前
记账网站-post功能
javascript·个人开发
鬼手点金1 小时前
Scrapy + Playwright 完整示例(JS 动态渲染网页)
开发语言·javascript·爬虫·python·scrapy·html·json
逝水无殇2 小时前
HTML 文本格式化详解:掌握 <strong>、<em>、<mark>、<del> 等常用标签
前端·javascript·html
特立独行的猫a2 小时前
DeepSeek Harness插件和工具的区别介绍及开发入门指南
前端·ai·agent·插件·deepseek·harness
小新讲网安2 小时前
HTTP请求走私攻击实战:CL.TE与TE.CL绕过前端服务器全解析
服务器·前端·网络·web安全·http·架构·漏洞
风骏时光牛马2 小时前
AI办公系统异常事件复盘分析
前端
console.log('npc')2 小时前
React 19 + Vite 企业级前端项目:从零搭建到规范交付
前端·react.js·前端框架
程序员黑豆2 小时前
Java字符串常量池完全指南:原理、intern()方法与性能优化最佳实践
java·前端·ai编程
光影少年2 小时前
react离线缓存、图片缓存方案
开发语言·前端·javascript·react native·react.js·缓存·前端框架
Canace2 小时前
笔记本都合上了,Claude 为什么还能在手机上执行电脑上装的技能?
前端·人工智能·ai编程