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

Zustand V5教程:Vanilla Store 与 useStore 使用详解 + 实战 Demo

Zustand 是一个轻量、灵活的状态管理库。自从 Zustand v4 推出 Vanilla Store 后,我们可以更优雅地在组件外(如 API 拦截器、工具函数)访问状态,同时在组件内继续享受响应式的状态订阅。

本教程将通过一个“登录状态管理”示例,讲解:

  • Vanilla Store 和 useStore 的区别
  • 如何在组件外获取状态
  • 如何在组件内响应状态变化
  • 实战完整代码(TypeScript + Zustand + Axios)

🧠 一图理解 Zustand 状态访问方式

场景用法是否响应式适合位置
组件内useStore(...)
或封装的 hook(如 useAuthToken()
✅ 是React 组件
组件外store.getState()
/ store.setState()
❌ 否axios、router、utils 等

🔧 Step 1:定义 Zustand Vanilla Store

// stores/authStore.ts
import { createStore, useStore } from "zustand";
import { persist, createJSONStorage } from "zustand/middleware";
import { immer } from "zustand/middleware/immer";interface AuthState {token: string | null;refreshToken: string | null;userId: string | null;userName: string | null;setToken: (token: string, refreshToken: string) => void;clearToken: () => void;userLogin: (data: {token: string;refreshToken: string;userId: string;userName: string;}) => void;
}export const authStore = createStore<AuthState>()(immer(persist((set) => ({token: null,refreshToken: null,userId: null,userName: null,setToken: (token, refreshToken) => set({ token, refreshToken }),clearToken: () =>set({token: null,refreshToken: null,userId: null,userName: null,}),userLogin: (userData) => {const { token, refreshToken, userId, userName } = userData;set({ token, refreshToken, userId, userName });},}),{name: "auth-storage",storage: createJSONStorage(() => localStorage),partialize: (state) => ({token: state.token,refreshToken: state.refreshToken,userId: state.userId,userName: state.userName,}),}))
);// 自定义 Hook
export const useAuthStore = <T>(selector: (state: AuthState) => T): T =>useStore(authStore, selector);export const useAuthToken = () =>useAuthStore((state) => state.token);export const useAuthUser = () =>useAuthStore((state) => ({userId: state.userId,userName: state.userName,}));export const useAuthActions = () =>useAuthStore((state) => ({login: state.userLogin,logout: state.clearToken,setToken: state.setToken,}));// 外部访问方法
export const getAuthState = () => authStore.getState();
export const setAuthState = authStore.setState;

🚀 Step 2:axios 中使用 token(非组件内)

// utils/axios.ts
import axios from "axios";
import { getAuthState } from "@/stores/authStore";const instance = axios.create({baseURL: "/api",timeout: 10000,
});instance.interceptors.request.use((config) => {const token = getAuthState().token;if (token) {config.headers.Authorization = `Bearer ${token}`;}return config;
});export default instance;

注意:我们没有用 **useAuthStore()**,因为拦截器不是 React 环境,不能使用 Hooks!


🧩 Step 3:React 组件中响应状态

// components/UserProfile.tsx
import React from "react";
import { useAuthUser, useAuthActions } from "@/stores/authStore";const UserProfile = () => {const { userId, userName } = useAuthUser();const { logout } = useAuthActions();return (<div><p>用户:{userName} (ID: {userId})</p><button onClick={logout}>退出登录</button></div>);
};

userNameuserId 发生变化时,组件会自动刷新。


🎯 总结

你要做什么推荐用法
React 组件内使用 tokenuseAuthToken()
React 组件内使用 user 信息useAuthUser()
React 中调用登录/登出方法useAuthActions()
在 axios、工具函数中获取 tokenauthStore.getState().token
或封装的 getAuthState()
在外部设置状态authStore.setState()
或封装的 setAuthState()
http://www.lryc.cn/news/2387262.html

相关文章:

  • docker 搭建php 开发环境 添加扩展redis、swoole、xdebug(1)
  • 人脸识别技术合规备案最新政策详解
  • (16)高性能风控系统设计
  • AStar低代码平台-脚本调用C#方法
  • 企业级RAG技术实战指南:从理论到落地的全景解析
  • getline()跳过输入
  • 【八股战神篇】RabbitMQ高频面试题
  • 高阶数据结构——红黑树实现
  • 互联网大厂Java求职面试:AI与大模型应用集成中的架构难题与解决方案
  • 安卓学习笔记-声明式UI
  • AI天气预报进入“大模型时代“:如何用Transformer重构地球大气模拟?
  • 本地项目如何设置https(2)——2025-05-19
  • 数据结构第3章 线性表 (竟成)
  • JAVA面试复习知识点
  • 项目中的流程管理之Power相关流程管理
  • SLOT:测试时样本专属语言模型优化,让大模型推理更精准!
  • 《计算机组成原理》第 10 章 - 控制单元的设计
  • 【数据结构与算法】模拟
  • PyTorch入门-torchvision
  • LVS负载均衡群集技术深度解析
  • 18、Python字符串全解析:Unicode支持、三种创建方式与长度计算实战
  • 5月27日复盘-Transformer介绍
  • CSV数据处理全指南:从基础到实战
  • MyBatis-Plus一站式增强组件MyBatis-Plus-kit(更新2.0版本):零Controller也能生成API?
  • 实时数仓flick+clickhouse启动命令
  • 【Git】Commit Hash vs Change-Id
  • Netty学习专栏(六):深度解析Netty核心参数——从参数配置到生产级优化
  • 服务器磁盘按阵列划分为哪几类
  • 在WPF中添加动画背景
  • 【KWDB创作者计划】_KWDB分布式多模数据库智能交通应用——高并发时序处理与多模数据融合实践