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

React Zustand状态管理库的使用

Zustand 是一个轻量级的状态管理库,适用于 React 和浏览器环境中的状态管理需求。它由 Vercel 开发并维护,旨在提供一种简单的方式来管理和共享状态。Zustand 的设计理念是尽可能简化状态管理,使其更加直观和易于使用。

Zustand 官网点击跳转

主要特点

  1. 轻量级:Zustand 的体积很小,只有几百字节,使得它非常适合现代 Web 应用程序。
  2. 易用性:使用 Zustaand 创建状态存储非常简单,只需要几行代码即可。
  3. 灵活性:Zustand 支持多种状态管理模式,包括普通的对象状态、函数状态等。
  4. 可组合性:可以很容易地组合多个状态存储,每个存储都可以独立管理自己的状态。
  5. 性能优化:Zustand 使用了高效的订阅机制,只在状态变化时重新渲染相关的组件。
  6. 跨平台支持:Zustand 不仅支持浏览器环境,还支持 Node.js 环境,可以用于 SSR(服务器端渲染)。

基本用法

创建状态存储

Zustand 使用 create 函数来创建一个新的状态存储。存储包含状态对象以及修改状态的方法。

import { create } from 'zustand';const useStore = create((set) => ({count: 0,increment: () => set((state) => ({ count: state.count + 1 })),decrement: () => set((state) => ({ count: state.count - 1 })),
}));
使用状态存储

一旦创建了状态存储,就可以在组件中使用它。

import useStore from './path/to/store';function Counter() {const { count, increment, decrement } = useStore();return (<div><button onClick={decrement}>-</button><span>{count}</span><button onClick={increment}>+</button></div>);
}
订阅状态变化

Zustand 会自动跟踪哪些组件订阅了状态,并在状态发生变化时重新渲染这些组件。这意味着你不需要手动传递状态或使用 useEffect 来监听状态变化。

高级用法

多个状态存储

你可以创建多个状态存储来管理不同的状态逻辑。

const useUserStore = create((set) => ({user: null,login: (user) => set({ user }),logout: () => set({ user: null }),
}));const useProductStore = create((set) => ({products: [],fetchProducts: async () => {// 更新状态},
}));
自定义中间件

Zustand 支持自定义中间件,可以用来添加日志记录、持久化状态等功能。

import create from 'zustand';
import persist from 'zustand/middleware/persist';const useStore = create(persist((set) => ({count: 0,increment: () => set((state) => ({ count: state.count + 1 })),decrement: () => set((state) => ({ count: state.count - 1 })),}),{ name: 'counter-storage' })
);

除了基本的用法之外,Zustand 还提供了许多扩展用法,以下是一些常见的扩展用法:

1. 嵌套状态

管理复杂的状态

const useStore = create(set => ({user: {name: 'John Doe',age: 30,address: {street: '123 Main St',city: 'Anytown'}},updateUserAge: (age) => set(state => ({user: { ...state.user, age }})),updateAddressCity: (city) => set(state => ({user: { ...state.user, address: { ...state.user.address, city } }}))
}));

2. 动态状态

可以使用函数来创建状态,这在某些情况下很有用,尤其是当状态依赖于外部条件时。

const useStore = create(set => ({count: Math.random(), // 初始状态可以是一个函数的结果increment: () => set(state => ({ count: state.count + 1 }))
}));

3. 中间件

Zustand 支持自定义中间件,可以用来添加日志记录、状态持久化等功能。

日志中间件
const loggerMiddleware = createStore => (...a) => {const store = createStore(...a);const originalSet = store.setState;store.setState = (...args) => {console.log('Setting state', args[0]);originalSet.apply(store, args);};return store;
};const useStore = create(loggerMiddleware(set => ({count: 0,increment: () => set(state => ({ count: state.count + 1 }))
})));
持久化中间件
import { persist } from 'zustand/middleware';const useStore = create(persist(set => ({count: 0,increment: () => set(state => ({ count: state.count + 1 })),decrement: () => set(state => ({ count: state.count - 1 }))}), {name: 'counter-storage', // 存储的 key 名称getStorage: () => localStorage // 存储位置,默认为 localStorage})
);

4. 同步状态

Zustand 提供了一种简单的方式来同步状态。

const useCounterStore = create(set => ({count: 0,increment: () => set(state => ({ count: state.count + 1 }))
}));const useUserStore = create(set => ({user: null,setUser: user => set(state => ({ user }))
}));// 同步状态
useCounterStore.subscribe(() => {console.log('Counter changed:', useCounterStore.getState().count);
});
useUserStore.subscribe(() => {console.log('User changed:', useUserStore.getState().user);
});

5. 异步操作

Zustand 可以很好地处理异步操作,如 API 请求。

const useStore = create(set => ({loading: false,data: null,fetchData: async () => {set({ loading: true });try {const response = await fetch('/api/data');const data = await response.json();set({ data, loading: false });} catch (error) {set({ loading: false });}}
}));

6. TypeScript 支持

TypeScript,Zustand 提供了类型安全的支持。

import type { StoreApi, UseBoundStore } from 'zustand';type State = {count: number;increment: () => void;decrement: () => void;
};const useStore = create<UseBoundStore<StoreApi<State>>>(set => ({count: 0,increment: () => set(state => ({ count: state.count + 1 })),decrement: () => set(state => ({ count: state.count - 1 }))
}));function Counter() {const { count, increment, decrement } = useStore();return (<div><button onClick={decrement}>-</button><span>{count}</span><button onClick={increment}>+</button></div>);
}

Zustand 的灵活性和易用性使得它成为一个非常强大的工具,特别是在中小型项目中。

相关文章:

React Zustand状态管理库的使用

Zustand 是一个轻量级的状态管理库&#xff0c;适用于 React 和浏览器环境中的状态管理需求。它由 Vercel 开发并维护&#xff0c;旨在提供一种简单的方式来管理和共享状态。Zustand 的设计理念是尽可能简化状态管理&#xff0c;使其更加直观和易于使用。 Zustand 官网点击跳转…...

pyrosetta MoveMap介绍

在 PyRosetta 中,MoveMap 是一个非常重要的类,用来控制蛋白质分子中哪些部分可以在某些操作(如折叠、旋转、优化等)中被移动。MoveMap 允许你精确地指定哪些残基、键角或原子可以进行特定的运动,从而帮助你在蛋白质结构预测、优化和设计中进行灵活的控制。 MoveMap 的功能…...

在线安全干货|如何更改IP地址?

更改IP地址是一个常见的需求&#xff0c;无论是为了保护个人隐私、绕过地理限制还是进行商业数据分析。不同的IP更改方法适用于不同的需求和环境。但请注意&#xff0c;更改IP地址应在合法场景下进行&#xff0c;无论使用什么方法&#xff0c;都需要在符合当地网络安全法律法规…...

【C++】【网络】【Linux系统编程】单例模式,加锁封装TCP/IP协议套接字

目录 引言 获取套接字 绑定套接字 表明允许监听 单例模式设计 完整代码示例 个人主页&#xff1a;东洛的克莱斯韦克-CSDN博客 引言 有关套接字编程的细节和更多的系统调用课参考《UNIX环境高级编程》一书&#xff0c;可以在如下网站搜索电子版&#xff0c;该书在第16章详…...

Matplotlib在运维开发中的应用

在现代运维开发中,数据可视化扮演着越来越重要的角色。它能帮助我们更直观地理解系统状态,快速发现潜在问题,并辅助决策制定。Python的Matplotlib库作为一个强大而灵活的绘图工具,在运维领域有着广泛的应用。本文将探讨Matplotlib在运维开发中的常见应用场景,并提供实用的代码示…...

centos下nvme over rdma 环境配置

nvme over rdma 环境配置 本文主要介绍NVMe over RDMA的安装和配置。关于什么是NVMe over Fabrics,什么是NVMe over RDMA&#xff0c;本文就不做介绍了&#xff0c;网上资料一大堆。 可以看看什么是NVMe over Fabrics&#xff1f; RDMA&#xff08;全称&#xff1a;Remote Dir…...

【C++】——多态详解

目录 1、什么是多态&#xff1f; 2、多态的定义及实现 2.1多态的构成条件 ​2.2多态语法细节处理 2.3协变 2.4析构函数的重写 2.5C11 override 和 final关键字 2.6重载—重写—隐藏的对比分析 3、纯虚函数和抽象类 4、多态的原理分析 4.1多态是如何实现的 4.2虚函数…...

STM32上实现FFT算法精准测量正弦波信号的幅值、频率和相位差(标准库)

在研究声音、电力或任何形式的波形时&#xff0c;我们常常需要穿过表面看本质。FFT&#xff08;快速傅里叶变换&#xff09;就是这样一种强大的工具&#xff0c;它能够揭示隐藏在复杂信号背后的频率成分。本文将带你走进FFT的世界&#xff0c;了解它是如何将时域信号转化为频域…...

计算机毕业设计 农场投入品运营管理系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…...

【笔记】2.1 半导体三极管(BJT,Bipolar Junction Transistor)

一、结构和符号 1. 三极管结构 常用的三极管的结构有硅平面管和锗合金管两种类型。各有PNP型和NPN型两种结构。 左图是NPN型硅平面三极管,右图是PNP型锗合金三极管。 从图中可见平面型三极管是先在一块大的金属板上注入杂质使之变成N型,然后再在中间注入杂质使之变成P型,…...

企业中文档团队的三种组织形式

大家好&#xff01;今天咱们来聊聊企业里文档团队都是怎么组织的。 企业中&#xff0c;常见的文档团队组织形式有三种。 首先&#xff0c;最常见的就是集中式的文档团队。就是说&#xff0c;公司里头有几个不同的部门&#xff0c;每个部门都需要做文档。于是呢&#xff0c;公…...

古诗词四首鉴赏

1、出自蓟北门行 唐李白 虏阵横北荒&#xff0c;胡星曜精芒。 羽书速惊电&#xff0c;烽火昼连光。 虎竹救边急&#xff0c;戎车森已行。 明主不安席&#xff0c;按剑心飞扬。 推毂出猛将&#xff0c;连旗登战场。 兵威冲绝漠&#xff0c;杀气凌穹苍。…...

全国行政区划下载(高德、阿里、天地图)

一、网站链接&#xff1a; 阿里云数据可视化平台&#xff1a; DataV.GeoAtlas地理小工具系列 (aliyun.com) 链接: link 高德地图API获取行政区域&#xff1a; 高德地图API获取行政区域 (naivemap.com) 链接: link 天地图服务中心&#xff1a; 天地图 服务中心 (tianditu.g…...

Springboot提升-MapStruct组件使用

文章目录 1. 添加依赖2. 创建映射接口3. 在Spring Boot中使用MapStruct映射器4. 配置MapStruct 在Spring Boot项目中使用MapStruct可以帮助你更方便地管理对象之间的映射逻辑。下面是一些基本步骤来设置和使用MapStruct&#xff1a; 1. 添加依赖 首先&#xff0c;你需要在项目…...

如何借助ChatGPT提升论文质量:实战指南

在学术写作的过程中,非英语母语人士经常面临诸多挑战,尤其是当论文要提交给国际期刊时,语言规范和表达逻辑成为了必须克服的障碍。本文将通过实例详细解析如何利用ChatGPT来润色论文,使其达到发表级别的标准。 一、优秀学术论文的写作特点 要让学术论文在国际期刊上发表,…...

NLP开端:Tokenizer-文本向量化

Tokenizer 问题背景 An was a algorithm engineer 如上所示&#xff0c;在自然语言处理任务中&#xff0c;通常输入处理的数据是原始文本。但是算法模型自能处理数值类型&#xff0c;因此需要找到一种方法&#xff0c;将原始的文本数据转换为数值类型的数据。这就是分词器所…...

STM32 MCU学习资源

STM32 MCU学习资源 文档下载需要注册登录账号 ST公司官方文档 STM32 MCU开发者资源 STM32F446 相关PDF文档 ST中文论坛 中文译文资料 ST MCU中文官网 其他学习资源 野火STM32库开发实战指南 零基础快速上手STM32开发&#xff08;手把手保姆级教程&#xff09; 直接使…...

Python知识点:Python内存管理与优化

开篇&#xff0c;先说一个好消息&#xff0c;截止到2025年1月1日前&#xff0c;翻到文末找到我&#xff0c;赠送定制版的开题报告和任务书&#xff0c;先到先得&#xff01;过期不候&#xff01; Python内存管理与优化指南 Python是一种动态类型的解释型语言&#xff0c;它提…...

SpringBoot Kafka发送消息与接收消息实例

前言 Kafka的基本工作原理 我们将消息的发布&#xff08;publish&#xff09;称作 producer(生产者)&#xff0c;将消息的订阅&#xff08;subscribe&#xff09;表述为 consumer&#xff08;消费者&#xff09;&#xff0c;将中间的存储阵列称作 broker(代理)&#xff0c;这…...

【资料分析】刷题日记2

第一套 √ 2013-2016一共有13&#xff0c;14&#xff0c;15&#xff0c;16四年&#xff0c;亦即16 - 13 1 4年 √ 是多少倍 ③vs④&#xff1a;都是只给出了年均增速&#xff0c;③求的是其中一年的&#xff0c;无法确定&#xff1b;④求的是这个时段总共的&#xff0c;可…...

intv_ai_mk11入门必看:从健康检查到参数调优的完整使用手册

intv_ai_mk11入门必看&#xff1a;从健康检查到参数调优的完整使用手册 1. 认识intv_ai_mk11 intv_ai_mk11是一个基于Llama架构的中等规模文本生成模型&#xff0c;特别适合处理通用问答、文本改写、解释说明和简短创作等任务。这个模型最大的特点是开箱即用——开发者已经完…...

SecGPT-14B模型微调:让OpenClaw更懂你的安全需求

SecGPT-14B模型微调&#xff1a;让OpenClaw更懂你的安全需求 1. 为什么需要微调安全模型 去年我在使用OpenClaw自动化处理公司安全日志时&#xff0c;发现一个尴尬现象&#xff1a;当要求AI分析潜在漏洞时&#xff0c;它总是给出一些"教科书式"的通用建议&#xff…...

FreeRTOS项目调试效率翻倍:给你的STM32F103工程嵌入一个轻量级日志模块(基于UART和StreamBuffer)

FreeRTOS项目调试效率革命&#xff1a;构建模块化日志系统的工程实践 调试嵌入式系统就像在黑暗森林中寻找萤火虫——你需要足够灵敏的工具捕捉那些稍纵即逝的线索。在STM32F103与FreeRTOS构成的典型嵌入式环境中&#xff0c;传统printf调试如同手持蜡烛探索&#xff0c;而模块…...

杰理之中控耳机支持通话中进行BLE广播的修改【篇】

修改ESCO和BLE广播的调度策略...

Si7021温湿度传感器I²C驱动开发与FreeRTOS工程实践

1. Si7021温湿度传感器驱动库深度解析与工程实践Si7021是由Silicon Labs&#xff08;芯科科技&#xff09;推出的一款高精度、低功耗数字式温湿度传感器&#xff0c;采用CMOS工艺集成电容式湿度传感单元与带隙温度传感单元&#xff0c;通过IC接口输出经过校准的12位湿度和14位温…...

seo站长论坛讨论哪些SEO热点话题_seo站长论坛如何运营自己的网站

SEO站长论坛讨论哪些SEO热点话题 在当前数字化竞争激烈的市场环境中&#xff0c;SEO&#xff08;搜索引擎优化&#xff09;已经成为每个网站运营者必不可少的技能。SEO站长论坛作为交流与分享的重要平台&#xff0c;各类热点话题层出不穷。在SEO站长论坛上&#xff0c;哪些话题…...

Windows下OpenClaw安装指南:一键对接Qwen3-4B-Thinking-2507-GPT-5-Codex-Distill-GGUF模型

Windows下OpenClaw安装指南&#xff1a;一键对接Qwen3-4B-Thinking-2507-GPT-5-Codex-Distill-GGUF模型 1. 为什么选择WindowsOpenClaw组合 去年我在帮一个创业团队搭建内部自动化工具时&#xff0c;第一次接触到OpenClaw。当时他们需要一套能自动处理客户反馈、生成日报的系…...

从模型到引擎:手把手教你用 trtexec 和 C++ API 在 Ubuntu 上部署 YOLOv8

从模型到引擎&#xff1a;手把手教你用 trtexec 和 C API 在 Ubuntu 上部署 YOLOv8 在计算机视觉领域&#xff0c;YOLOv8 凭借其卓越的实时检测性能成为工业界的热门选择。但训练好的模型要真正落地&#xff0c;还需要经过关键的部署环节。本文将带你深入探索两种主流部署路径…...

2026届毕业生推荐的五大AI论文网站实际效果

Ai论文网站排名&#xff08;开题报告、文献综述、降aigc率、降重综合对比&#xff09; TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 倚仗自然语言处理跟学术知识图谱技术的AI开题报告工具&#xff0c;能够快速生成研究背景、文…...

BsMax:让3D艺术家无缝切换Blender的专业级工具集

BsMax&#xff1a;让3D艺术家无缝切换Blender的专业级工具集 【免费下载链接】BsMax BsMax Blender Addon (UI simulator/ Modeling/ Rigg & Animation/ Render Tools and ... 项目地址: https://gitcode.com/gh_mirrors/bs/BsMax 你是否曾经因为Blender的操作习惯与…...