Zustand介绍与使用 React状态管理工具

news2024/11/22 22:18:09

在这里插入图片描述

文章目录

      • 前言
      • 基本使用
        • 编写状态加方法
        • 在组件中使用
        • 异步方法操作
      • 中间件
      • 简化状态获取
        • 优化性能
      • 持久化保存

前言

在现代前端开发中,状态管理一直是一个关键的挑战。随着应用规模的扩大,组件间的状态共享变得愈加复杂。为了应对这一需求,开发者们逐渐寻找更加轻量、灵活的解决方案。在众多状态管理库中,Zustand 以其简洁易用的特点脱颖而出。

Zustand 是一个基于 React 的状态管理库,旨在提供简单而强大的状态管理功能。与传统的状态管理工具相比,Zustand 采用了更为直观的 API 设计,降低了学习成本,让开发者能够快速上手。它的核心理念是“最小化”,意味着你可以只为应用中需要的部分状态创建 store,而不是强迫使用全局状态,进而提高了应用的性能和可维护性。

Zustand 的优势还在于其灵活性。它允许开发者在不牺牲性能的前提下,使用多种方式管理状态,包括异步操作、持久化存储等。同时,Zustand 还支持中间件功能,如 immer 和 devtools,让状态更新变得更加简洁,并方便开发和调试。

在这篇文章中,我们将深入探讨 Zustand 的核心概念、使用方法以及它在实际开发中的应用案例。通过对 Zustand 的全面解析,期望能够帮助开发者在构建高效、可维护的 React 应用时,更好地利用这一强大的状态管理工具。

基本使用

编写状态加方法
import {create} from 'zustand'

const useBookStore = create<any>((set,get)=>({

price: 30,

total:100,

increment(){

set(( state:any ) => ({ total: state.total + 1 }));

},

decrement(){

set(( state:any ) => ({ total: Math.max(state.total - 1, 0) })); // 确保total不小于0

},

getTotal(){

return get().price * get().total

}

}))

export default useBookStore

在组件中使用
const Child1 =() => {

const price = useBookStore((state:any)=> state.price)

const total= useBookStore((state:any)=> state.total)

const increment = useBookStore((state:any) => state.increment )

const decrement = useBookStore((state:any) => state.decrement )

const getTotal = useBookStore((state:any)=> state.getTotal)

return (

<>

<h2>{price}</h2>

<h2>{total}</h2>

<h2>{getTotal()}</h2>

<button onClick={decrement}>decrement</button>

<button onClick={increment}>increment</button>

</>

)

}
异步方法操作
async bookPromotion(){

//使用Promise来模仿异步操作

let rate = await Promise.resolve(0.8);

set(( state:any )=>{

state.price *= rate

})

}

中间件

immer 简化不可变状态更新 不用每次都返回一个对象了

import {immer } from 'zustand/middleware/immer'

const useBookStore = create<any>()(immer((set,get)=>({

price: 40,

total:100,

increment(){

set(( state:any ) => { state.total += 1 });

},

decrement(){

set(( state:any ) => { Math.max(state.total -= 1, 0) }); // 确保total不小于0

},

getTotal(){

return get().price * get().total

},

async bookPromotion(){

//使用Promise来模仿异步操作

let rate = await Promise.resolve(0.8);

set(( state:any )=>{

state.price *= rate

})

}

})))

export default useBookStore

简化状态获取

使用解构赋值

const { price, total, increment, decrement, getTotal, bookPromotion } = useBookStore((state) => ({ price: state.price, total: state.total, increment: state.increment, decrement: state.decrement, getTotal: state.getTotal, bookPromotion: state.bookPromotion, }));
优化性能

Child1Child2 组件都使用了相同的状态管理商店(store),这意味着它们会共享相同的状态。当你在 Child1 中更新状态时,Child2 即使store没有发生变化也会跟着执行,因为它们都从同一个 store 中获取数据。这非常浪费性能
使用useShallow包裹

import { useShallow } from 'zustand/react/shallow'

import useBookStore from './zustand/index.tsx'
const Child1 =() => {

// const price = useBookStore((state:any)=> state.price)

// const total= useBookStore((state:any)=> state.total)

const increment = useBookStore((state:any) => state.increment )

const decrement = useBookStore((state:any) => state.decrement )

const getTotal = useBookStore((state:any)=> state.getTotal)

const bookPromotion= useBookStore((state:any)=> state.bookPromotion)

const {price,total} = useBookStore()

return (

<>

<h2>{price}</h2>

<h2>{total}</h2>

<h2>{getTotal()}</h2>

<button onClick={decrement}>decrement</button>

<button onClick={bookPromotion}>promotion</button>

<button onClick={increment}>increment</button>

</>

)

}

const Child2 = () => {

const {test} = useBookStore(useShallow((state:any) =>({ test: state.test})))

console.log(1,2,test)

return <h2>{test}</h2>

}

Redux DevTools插件

import {devtools}from "zustand/middleware"
{enable:true,name"bookstore"}

持久化保存

import create from 'zustand';

import { persist } from 'zustand/middleware';

  

// 创建一个持久化的 store

const useStore = create(persist(

(set) => ({

count: 0,

increase: () => set((state) => ({ count: state.count + 1 })),

decrease: () => set((state) => ({ count: state.count - 1 })),

}),

{

name: ###, // 存储的 key 名称

storage: create(()=> sessionStorage), // 可以选择使用 localStorage 或 sessionStorage
	  
partialize:(state) => ({key:value})
}

));

文章到这里就结束了,希望对你有所帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2224257.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java-图书管理系统

我的个人主页 欢迎来到我的Java图书管理系统&#xff0c;接下来让我们一同探索如何书写图书管理系统吧&#xff01; 1管理端和用户端 2建立相关的三个包&#xff08;book、operation、user&#xff09; 3建立程序入口Main类 4程序运行 1.首先图书馆管理系统分为管理员端和…

使用Poste搭建内网邮件服务器

使用Poste搭建内网邮件服务器 Poste.io 也是一个流行的邮件服务器方案&#xff0c;它可以通过 Docker 容器轻松部署&#xff0c;非常适合搭建内部邮件服务器。 本文档将向您展示如何开始使用 Poste.io 邮件服务器。在 5 分钟内&#xff0c;您将拥有一个可发送和接收邮件的邮件…

Springboot 使用EasyExcel导出Excel文件

Springboot 使用EasyExcel导出Excel文件 Excel导出系列目录&#xff1a;引入依赖创建导出模板类创建图片转化器 逻辑处理controllerservice 导出效果遗留问题 Excel导出系列目录&#xff1a; 【Springboot 使用EasyExcel导出Excel文件】 【Springboot 使用POI导出Excel文件】 …

基于Python大数据的王者荣耀战队数据分析及可视化系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

es实现自动补全

目录 自动补全 拼音分词器 安装拼音分词器 第一步&#xff1a;下载zip包&#xff0c;并解压缩 第二步&#xff1a;去docker找到es-plugins数据卷挂载的位置&#xff0c;并进入这个目录 第三步&#xff1a;把拼音分词器的安装包拖到这个目录下 第四步&#xff1a;重启es 第…

使用freemarker实现在线展示文档功能开发,包括数据填充

首先&#xff0c;在这个独属于程序员节日的这一天&#xff0c;祝大家节日快乐【求职的能找到心仪的工作&#xff0c;已经工作的工资翻倍】。 ---------------------------------------------------------------回到正文-----------------------------------------------------…

大数据处理随堂测试

HDFS MapReduce HBase Spark

【Linux驱动开发】设备树节点驱动开发入门

【Linux驱动开发】设备树节点驱动开发入门 文章目录 设备树文件设备树文件驱动开发附录&#xff1a;嵌入式Linux驱动开发基本步骤开发环境驱动文件编译驱动安装驱动自动创建设备节点文件 驱动开发驱动设备号地址映射&#xff0c;虚拟内存和硬件内存地址字符驱动旧字符驱动新字…

Redis 集群 总结

前言 相关系列 《Redis & 目录》&#xff08;持续更新&#xff09;《Redis & 集群 & 源码》&#xff08;学习过程/多有漏误/仅作参考/不再更新&#xff09;《Redis & 集群 & 总结》&#xff08;学习总结/最新最准/持续更新&#xff09;《Redis & 集群…

Postman常见问题及解决方(全)

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 1、网络连接问题 如果Postman无法发送请求或接收响应&#xff0c;可以尝试以下操作&#xff1a; 检查网络连接是否正常&#xff0c;包括检查网络设置、代理设置…

接口测试(五)jmeter——get请求

一、get请求——短信验证码&#xff08;示例仅供参考&#xff09; 1. get请求&#xff1a;传参数据直接拼接在地址后面&#xff0c;jmeter不需要设置请求头content-type 注&#xff1a;短信验证码接口&#xff0c;返回结果中不会返回短信验证码&#xff0c;是存在数据库表中&a…

Pyramidal Flow使用指南:快手、北大、北邮,开源可免费商用视频生成模型,快速上手教程

什么是 Pyramidal Flow&#xff1f; Pyramidal Flow 是由快手科技、北京大学和北京邮电大学联合推出的开源视频生成模型&#xff0c;它是完全开源的&#xff0c;发布在 MIT 许可证下&#xff0c;允许商业使用、修改和再分发。该模型能够通过文本描述生成最高10秒、分辨率为128…

EveryoneNobel:为每个人打造诺贝尔奖风格的纪念图片

在这个充满荣誉和成就的时代&#xff0c;EveryoneNobel 项目应运而生&#xff0c;旨在为每个人提供一个生成诺贝尔奖风格纪念图片的机会。通过利用 ComfyUI 进行图像生成&#xff0c;结合 HTML 模板展示文字&#xff0c;不仅提供了一个生成诺贝尔奖图片的流程&#xff0c;而且构…

【Python爬虫实战】Selenium自动化网页操作入门指南

#1024程序员节&#xff5c;征文# &#x1f308;个人主页&#xff1a;易辰君-CSDN博客 &#x1f525; 系列专栏&#xff1a;https://blog.csdn.net/2401_86688088/category_12797772.html ​ 目录 前言 一、准备工作 &#xff08;一&#xff09;安装 Selenium 库 &#xff0…

2024 年我的 MacBook 软件开发设置分享

在过去的一年里&#xff0c;我的 MacBook 软件开发环境经历了一些变化。今天&#xff0c;我想分享我的最新设置、工作流程和工具&#xff0c;帮助你在软件开发中提升效率。 我的工作设备 &#x1f4bb; 我目前使用的是 16 英寸的 MacBook Pro M1 Max。这台机器的性能令人印象…

「C/C++」C++ STL容器库 之 std::multimap 键值对的集合容器

✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「C/C」C/C程序设计&#x1f4da;全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasoli…

化验单智能识别与数据抽取:AI平台赋能医疗信息化

化验单处理在医院日常运作中常遇信息量大、数据整理不易、效率低的问题。思通数科推出的AI多模态平台&#xff0c;借助光学字符识别&#xff08;OCR&#xff09;、图像处理等技术&#xff0c;提供了一款开源化验单智能识别系统&#xff0c;能迅速识别、提取和分析化验单数据。 …

【云原生网关】Higress 从部署到使用详解

目录 二、网关概述 2.1 什么是云原生网关 2.2 常见的云原生网关 2.2.1 Nginx 2.2.2 ApiSix 2.2.3 Kong 2.2.4 Apache Shenyu 2.2.5 Higress 2.2.6 Envoy​​​​​​​ 三、higress介绍 3.1 什么是higress 3.2 Higress 定位 3.3 Higress 内核选择 四、Higress搭…

10.22.2024刷华为OD C题型(三)--for循环例子

脚踝动了手术&#xff0c;现在宾馆恢复&#xff0c;伤筋动骨一百天还真不是说笑的&#xff0c;继续努力吧。 文章目录 靠谱的车灰度图恢复灰度图恢复 -- for循环使用例子 靠谱的车 https://www.nowcoder.com/discuss/564514429228834816 这个题目思路不难&#xff0c;就是要自…

网络一些相关术语

目录 网络一些相关术语 转发平面效率 可扩展性 控制平面 网络拓扑 服务质量&#xff08;QoS&#xff09; 网络协议 网络带宽 网络拥塞 网络安全 网络冗余 网络切片 网络延迟 网络地址转换&#xff08;NAT&#xff09; 虚拟专用网络&#xff08;VPN&#xff09; …