Zustand浅学习

道阻且长,行而不辍,未来可期
之前只是会使用zustand,也没仔细看过zustand的文档,前段时间一个合约朋友问我前端的zustand怎么用,啊,这,是那个笑起来明媚的不像话的帅哥问我问题诶,那我得认真一下下,尽管已是前同事,还是希望他在异国他乡前程锦绣。
哈哈哈,知识是用来共享的,也希望能帮到 路过的公主 or 王子。

首先看一下Zustand 官方是如何王婆卖瓜的,啊,不,是如何精准的介绍自己的

A small, fast, and scalable bearbones state management solution. Zustand has a comfy API based on hooks. It isn’t boilerplatey or opinionated, but has enough convention to be explicit and flux-like.

小型、快速且可扩展的 bearbones 状态管理解决方案。Zustand 具有基于hooks的舒适 API。
剩下那句叙事,就让他叙吧,继续往下看
嗯,看点实际的,如何使用

Step1:

请添加图片描述
哦,store是一个hook, 可以在store里面放任何类型的数据:原始类型,对象类型,函数 等。
Set 这个函数用于“合并”状态

Step2:

请添加图片描述

在组件中使用"store"
你可以在任何地方使用这个hook,不需要Provider.


其实,到这里,zustand–store 的最简单的使用demo已经展示完了。
哈哈哈,想要在众多状态管理库中占有一席之地,总的有自己的长处吧
酒香也怕巷子深,且看zustand是如何表明自己的优势的

请添加图片描述
Zustand 有很多关于React的状态管理库,在Comparison 页将会进行讨论。将Zustand和Redux,库进行比较
每一个库都有自己的强点和弱点,zustand 官方 将比较一下这些库之间 “不同”和“相似”之处

Zustand VS Redux(不同)

请添加图片描述
Zustand 和 Redux 十分的相似,他们俩都是基于“不可变”的状态模块。但是Redux要求你的app被redux 的 Provider 所包裹,而 zustand 则不用。

Zustand VS Redux (相似)

请添加图片描述
在渲染方面,Zustand 和 Redux 是非常的相似。
代码我就不贴啦,这里了解一下Zustand得优势就好啦,想看示例的
网址在这里:https://zustand.docs.pmnd.rs/getting-started/comparison

更新Store的状态

刚刚有提到set是用来合并状态的,既然官方把它单独列出来,又说了一遍,就足以体现它的重要性,那我再说一遍,哈哈哈。

请添加图片描述
更新Zustand 的状态非常简单,调用 它 提供的set方法就可以了。set方法拥有新的状态,它将和旧的状态进行合并。

如何与TS一起使用

毕竟现在没有人用js开发了吧,看看zustand官方怎么使用的。
使用ts以后,就必须使用create来代替creat了。

请添加图片描述
为什么要给create 定义状态?它自己不能推断出状态吗?

请添加图片描述
从上面我们可以看出x最开始是 unknow 类型,后被 interface X 替代
在没有给泛型赋值之前,泛型T是unknow类型。

或者,你可以使用combine ,它能推断出store的类型,你就不用自己给它赋类型了。

请添加图片描述
至于为什么,‘’-``😩单词都认识,but,解释的太抽象了,看不透本质,谁看懂了,告诉我一下,求求。

如何使用中间件

不需要做什么特别的事情就可以使用中间件了。
嗯?这么容易 ?

请添加图片描述
哦,使用中间件的时候需要在create里面立刻执行
。。。没听懂???
那我再解释一遍:就是把creat由普通函数---->立即执行函数,立刻执行中间件,使内容承上启下。


嗯,也可以把上面的方法,抽出来,优化一下。

请添加图片描述

注意:

请添加图片描述
此外,我们建议尽可能在最外层使用 devtools 中间件。
例如,当您将其与 immer 一起使用作为中间件时,它应该是 devtools(immer(…)) 而不是 immer(devtools(…))。这是因为 devtools 会改变 setState 并在其上添加一个类型参数,如果其他中间件(如 immer)也在 devtools 之前改变 setState,则该参数可能会丢失。因此,在最后使用 devtools 可确保没有中间件在它之前改变 setState。

Slice(TS) 分片

总不能把所有的数据都写在一个文件里吧,那得多邋遢呀

const rootState=create((set,get)=>({bookList: [{ name: '当怪兽来敲门' }],addBook: (book: BookState) => set((state) => {return { bookList: [...state.bookList, book] }}),prizeList: [{ name: '常青藤文学奖' }],
})

创建切片,也就是说把属性按类别分模块

//把属性按模块分开
//值时对象
export const createBookSlice= (set, get) => ({bookList: [{ name: '当怪兽来敲门' }],addBook: (book: BookState) => set((state) => {return { bookList: [...state.bookList, book] }})
})
//值是对象
export const createPrizeSlice = (set, get) => ({prizeList: [{ name: '常青藤文学奖' }],
})
//合并到根状态
const rootState=create((set,get)=>{return {...createBookSlice(set,get),...createPrizeSlice(set,get)}
}
因为最终都整合到rootState中了,取切片的方法时,从rootState中取
例如:const { bookList }=rootState

使用TS写一个未使用中间件的demo

StateCreator<MyState, [], [], MySlice>
请添加图片描述

使用中间件时TS写法

import { devtools, persist } from 'zustand/middleware'export const useRootStore = create<BookSlice & PrizeSlice,[["zustand/devtools", never], ["zustand/persist", unknown]]
>(devtools(persist((...a) => ({...createBookSlice(...a),...createPrizeSlice(...a),}),{ name: `save all data to localStorage,this is the data's key` },),))

这个中间件干嘛的诶?哦,原来是把数据缓存到本地诶

请添加图片描述

上面,是把所有的数据都存入localStorage中了,如果我不想全部缓存呢?继续往下看

Persisting store data

请添加图片描述
Persist 中间件可让您将 Zustand 状态存储在存储中(例如 localStorage、AsyncStorage、IndexedDB 等),从而持久保存其数据。
请注意,此中间件确实支持同步存储(例如 localStorage)和异步存储(例如 AsyncStorage),但使用异步存储确实会带来成本。

看看Persist的属性:

  1. name:作为storage中数据的key
  2. storage:默认是localStorage

请添加图片描述

把你想要存储到localStorage中的数据,赋值给partialize属性

请添加图片描述

属性很多:https://zustand.docs.pmnd.rs/integrations/persisting-store-data
自己慢慢看吧

可能我说的不太好,基本上全是贴的官网的截图,哈哈哈,纯属我个人习惯,总觉着不从官网了解,心里不踏实。
如果你有更好的学习资料,希望不吝分享@_@

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

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

相关文章

海量数据迁移:Elasticsearch到OpenSearch的无缝迁移策略与实践

文章目录 一&#xff0e;迁移背景二&#xff0e;迁移分析三&#xff0e;方案制定3.1 使用工具迁移3.2 脚本迁移 四&#xff0e;方案建议 一&#xff0e;迁移背景 目前有两个es集群&#xff0c;版本为5.2.2和7.16.0&#xff0c;总数据量为700T。迁移过程需要不停服务迁移&#…

【贪心算法】贪心算法三

贪心算法三 1.买卖股票的最佳时机2.买卖股票的最佳时机 II3.K 次取反后最大化的数组和4.按身高排序5.优势洗牌&#xff08;田忌赛马&#xff09; 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1f496;&#x1f496; 你的支持是对我最大的鼓励&#…

Devops业务价值流:敏捷测试最佳实践

在迭代增量开发模式下&#xff0c;我们强调按照用户故事的优先级进行软件小功能的频繁交付。由于迭代周期紧凑&#xff0c;测试与开发活动往往并行进行&#xff0c;测试时间相对有限。为确保在这种快节奏的开发环境中依然能够保持产品质量&#xff0c;我们特制定以下测试阶段的…

el-table 纵向垂直表头处理

项目中表格展示会遇到需要纵向垂直表头情况&#xff0c;下面&#xff0c;我们基于el-table组件来实现这种表格。 以下是这次需要用到的数据表格&#xff0c;已知左侧违章名称是固定的&#xff0c;而月份是不固定的&#xff0c;在后端返回数据格式已确定的情况下&#xff0c;需…

HDFS和HBase跨集群数据迁移 源码

HDFS集群间数据迁移&#xff08;hadoop distcp&#xff09; hadoop distcp \ -pb \ hdfs://XX.14.36.205:8020/user/hive/warehouse/dp_fk_tmp.db/ph_cash_order \ hdfs://XX.18.32.21:8020/user/hive/warehouse/dp_fksx_mart.db/HBase集群间数据&#xff08;hbase ExportSnap…

浅谈单片机的gcc优化级别__以双音频信号发生器为例

IDE&#xff1a; CLion HOST&#xff1a; Windows 11 MinGW&#xff1a;x86_64-14.2.0-release-posix-seh-ucrt-rt_v12-rev0 GCC&#xff1a; arm-gnu-toolchain-13.3.rel1-mingw-w64-i686-arm-none-eabi 一、简介 gcc有多种优化级别&#xff0c;一般不选择的情况下&#x…

Ceph MDS高可用架构探索:从零到一构建多主一备MDS服务

文章目录 Ceph实现MDS服务多主一备高可用架构当前 mds 服务器状态添加 MDS 服务器验证ceph集群当前状态当前的文件系统状态设置处于激活状态 mds 的数量MDS 高可用优化分发配置文件并重启 mds 服务 Ceph实现MDS服务多主一备高可用架构 Ceph 的元数据服务&#xff08;MDS&#…

PySpark 数据处理实战:从基础操作到案例分析

Spark 的介绍与搭建&#xff1a;从理论到实践_spark环境搭建-CSDN博客 Spark 的Standalone集群环境安装与测试-CSDN博客 PySpark 本地开发环境搭建与实践-CSDN博客 Spark 程序开发与提交&#xff1a;本地与集群模式全解析-CSDN博客 Spark on YARN&#xff1a;Spark集群模式…

使用GPT-SoVITS训练语音模型

1.项目演示 阅读单句话 1725352713141 读古诗 1725353700203 2.项目环境 开发环境&#xff1a;linux 机器配置如下&#xff1a;实际使用率百分之二十几&#xff0c; 3.开发步骤 1.首先是准备数据集&#xff0c;要求是wav格式&#xff0c;一到两个小时即可&#xff0c; 2.…

Python学习从0到1 day27 Python 高阶技巧 ③ 设计模式 — 单例模式

此去经年&#xff0c;再难同游 —— 24.11.11 一、什么是设计模式 设计模式是一种编程套路&#xff0c;可以极大的方便程序的开发最常见、最经典的设计模式&#xff0c;就是我们所学习的面向对象了。 除了面向对象外,在编程中也有很多既定的套路可以方便开发,我们称之为设计模…

3.2 软件需求:面对过程分析模型

面对过程分析模型 1. 需求分析的模型概述1.1 面对过程分析模型-结构化分析方法1.2 结构化分析的过程 2. 功能模型&#xff1a;数据流图初步2.1 加工2.2 外部实体&#xff08;数据源点/终点&#xff09;2.3 数据流2.4 数据存储2.5 注意事项 3. 功能模型&#xff1a;数据流图进阶…

Android Studio 运行模拟器无法打开avd

问题&#xff1a;已经下载了HAXM 打开模拟器时还是提示未下载HAXM&#xff0c;无法打开avd 解决方案&#xff1a; 控制面板 -> 启动或关闭Windows功能&#xff0c;打开图下两项&#xff0c;后重启电脑重启Android Studio&#xff1a;

Qt文件系统-二进制文件读写

实例功能概述 除了文本文件之外&#xff0c;其他需要按照一定的格式定义读写的文件都称为二进制文件。每种格式的二进制文件都有自己的格式定义&#xff0c;写入数据时按照一定的顺写入&#xff0c;读出时也按照相应的顺读出。例如地球物理中常用的SEG-Y格式文件&#xff0c;必…

ARXML汽车可扩展标记性语言规范讲解

ARXML: Automotive Extensible Markup Language &#xff08;汽车可扩展标记语言&#xff09; xmlns: Xml name space &#xff08;xml 命名空间&#xff09; xsd: Xml Schema Definition (xml 架构定义) 1、XML与HTML的区别&#xff0c;可扩展。 可扩展&#xff0c;主要是…

游戏引擎学习第六天

这节讲的内容比较多: 参考视频:https://www.bilibili.com/video/BV1apmpYVEQu/ XInput 是微软提供的一个 API&#xff0c;用于处理 Windows 平台上 Xbox 控制器&#xff08;包括有线和无线&#xff09;及其他游戏控制器的输入。它为开发者提供了一组函数&#xff0c;用于查询控…

vivado+modelsim: xxx is not a function name

xxx is not a function name vivado问题:xxx is not a function name原因 vivado问题:xxx is not a function name 在写verilog modelsim仿真时&#xff0c;遇到error&#xff1a;xxx is not a function name。 原因 该变量xxx在仿真文件里&#xff0c;如下图红框所示&#…

云计算在教育领域的应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 云计算在教育领域的应用 云计算在教育领域的应用 云计算在教育领域的应用 引言 云计算概述 定义与原理 发展历程 云计算的关键技…

立体工业相机提升工业自动化中的立体深度感知

深度感知对仓库机器人应用至关重要&#xff0c;尤其是在自主导航、物品拾取与放置、库存管理等方面。 通过将深度感知与各种类型的3D数据&#xff08;如体积数据、点云、纹理等&#xff09;相结合&#xff0c;仓库机器人可以在错综复杂环境中实现自主导航&#xff0c;物品检测…

模拟鼠标真人移动轨迹算法-易语言

一.简介 鼠标轨迹算法是一种模拟人类鼠标操作的程序&#xff0c;它能够模拟出自然而真实的鼠标移动路径。 鼠标轨迹算法的底层实现采用C/C语言&#xff0c;原因在于C/C提供了高性能的执行能力和直接访问操作系统底层资源的能力。 鼠标轨迹算法具有以下优势&#xff1a; 模拟…

JavaWeb——Web入门(8/9)- Tomcat:基本使用(下载与安装、目录结构介绍、启动与关闭、可能出现的问题及解决方案、总结)

目录 基本使用内容 下载与安装 目录结构介绍 启动与关闭 启动 关闭 可能出现的问题及解决方案 问题一&#xff1a;启动时窗口一闪而过 问题二&#xff1a;端口号冲突 问题三&#xff1a;部署应用程序 总结 基本使用内容 Tomcat 服务器在 Java Web 开发中扮演着至关重…