react状态管理库---zustand

一个简单的,快速的状态管理解决方案,api设计基于函数式和hooks

安装:

npm install zustand 

基础使用

让我们实现一个非常简单的计数器案例完成我们的第一个store

1- 创建一个counterStore

create( ) 有三个参数:函数布尔值、XX
可以放任何东西:基本类型值、对象、函数。

  • 若第二个参数不传或为 false 时,新状态将会和create方法原来的返回值进行 融合 ;(默认为false)
  • 若第二个值为 true 时,新状态将会直接 覆盖 create方法原来的返回值。
  • 可以利用这个特性清空 store。
import create from 'zustand'const useCounterStore = create((set) => ({// 数据count: 0,// 修改数据的方法increase: () => set(state => ({ count: state.count + 1 })),decrease: () => set(state => ({ count: state.count - 1 }))
}))export default useCounterStore

2- 绑定到组件

import useCounterStore from './store'const App = () => {const count = useCounterStore((state) => state.count)const decrease = useCounterStore((state) => state.increase)const increase = useCounterStore((state) => state.decrease)return (<div><button onClick={decrease}>+</button><span>{count}</span><button onClick={increase}>-</button></div>)
}export default App

3- 使用方法

  • 获取所有状态
// 这样会导致该组件在每一个状态变化时都要进行更新。
const state = useStore();
  • 选择多个状态切片
// 获取方法与基本数据同理
const increasePopulation = useStore(state => state.increasePopulation)
const removeAllBears = useStore(state => state.removeAllBears)
  • 传递 shallow 构造一个内部要多个状态的对象。
import shallow from "zustand/shallow";// 对象选取,当state.nuts或state.honey改变时,重新渲染组件。
const { name, age } = useStore(state => { name: state.name, age: state.age }, shallow)
// 数组选取,当state.nuts或state.honey改变时,重新渲染组件。
const [name, age] = useStore(state => [state.name, state.age], shallow);
// 映射选取,当state.treats在顺序、数量或对象键上发生变化时,重新渲染组件
const treats = useStore((state) => Object.keys(state.treats), shallow);
  • 通过 setState 可直接修改状态
import useStore from './index';
import shallow from 'zustand/shallow';
import { Button } from '@douyinfe/semi-ui'export const test= () => {// 1、获取所有状态,通过点.使用const state = useStore()// 2、选择多个切片状态const bears = useStore(state => state.bears)const increasePopulation = useStore(state => state.increasePopulation)const removeAllBears = useStore(state => state.removeAllBears)// 3、使用 shallow 构造一个内部要多个状态的对象// const { name, age } = useStore(state => { name: state.name, age: state.age }, shallow)// 对象选取const [name, age] = useStore(state => [state.name, state.age], shallow);// 数组选取// 通过 setState 直接修改状态const subtractBears = () => {useStore.setState({ bears: bears - 1, age: age - 1})}return (<div><h1>bears:{bears}</h1><h1>bears:{state.bears}</h1><h1>name:{name}</h1><h1>age:{age}</h1><Button onClick={increasePopulation}>加1</Button><Button onClick={subtractBears}>减1</Button><Button onClick={removeAllBears}>重置为0</Button></div>)
};

通常建议用 useCallback 来记忆选择器。这将避免在每次渲染时进行不必要的计算。
利用 useCallback 甚至可以跳过普通 compare,而仅关心外部 id 值的变化。

const fruit = useStore(useCallback((state) => state.fruits[id], [id]));
异步支持

1- 创建异步action

import create from 'zustand'const fetchApi = () => {return new Promise((resolve) => {setTimeout(() => {resolve(['vue', 'react'])}, 2000)})
}const useListStore = create((set) => ({// 数据list: [],// 修改数据的方法fetchList: async () => {const res = await fetchApi()set({ list: res })}
}))export default useListStore

2- 绑定组件

import { useEffect } from 'react'
import useListStore from './store'const App = () => {const list = useListStore((state) => state.list)const fetchList = useListStore((state) => state.fetchList)useEffect(() => {fetchList()}, [])return (<div>{JSON.stringify(list)}</div>)
}export default App
在没有 React 的情况下使用 zustand

zustands 的核心可以在不依赖 React 的情况下被导入和使用。
唯一的区别是,创建函数不返回 hook,而是返回一系列 api 函数。

import create from 'zustand/vanilla'const store = create(() => ({ ... }))
const { getState, setState, subscribe, destroy } = store

甚至可以用 React 消费现有的 vanilla store。

import create from "zustand";
import vanillaStore from "./vanillaStore";const useStore = create(vanillaStore);

注意修改set或get的中间件不应用于getState和setState。

增加调试

简单的调试我们可以安装一个 名称为 simple-zustand-devtools 的调试工具

1- 安装调试包

$ yarn add simple-zustand-devtools

2- 配置调试工具

import create from 'zustand'// 导入核心方法
import { mountStoreDevtool } from 'simple-zustand-devtools'const useStore = create((set) => ({}))// 开发环境开启调试
if (process.env.NODE_ENV === 'development') {// 第一个参数为调试的store标识mountStoreDevtool('counterStore', useStore)
}export default useStore

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

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

相关文章

Leetcode - 127双周赛

目录 一&#xff0c;3095. 或值至少 K 的最短子数组 I 二&#xff0c;3096. 得到更多分数的最少关卡数目 三&#xff0c;3097. 或值至少为 K 的最短子数组 II 四&#xff0c;3098. 求出所有子序列的能量和 一&#xff0c;3095. 或值至少 K 的最短子数组 I 本题需要知道一个知…

先进电气技术 —— (控制理论)何为稳定性?

一、系统稳定性 在控制理论中&#xff0c;系统稳定性是一个非常关键的概念&#xff0c;它主要涉及系统对外界扰动或内部变动的响应行为。以下是与系统稳定性相关的一些核心名词及其解释&#xff1a; 基本概念 稳定性&#xff08;Stability&#xff09; 系统稳定性是指当系统受…

Midjourney艺术家分享|By Moebius

Moebius&#xff0c;本名让吉拉德&#xff08;Jean Giraud&#xff09;&#xff0c;是一位极具影响力的法国漫画家和插画师&#xff0c;以其独特的科幻和幻想风格而闻名于世。他的艺术作品不仅在漫画领域内受到高度评价&#xff0c;也为电影、时尚和广告等多个领域提供了灵感。…

鸿蒙OS开发实例:【应用状态变量共享】

平时在开发的过程中&#xff0c;我们会在应用中共享数据&#xff0c;在不同的页面间共享信息。虽然常用的共享信息&#xff0c;也可以通过不同页面中组件间信息共享的方式&#xff0c;但有时使用应用级别的状态管理会让开发工作变得简单。 根据不同的使用场景&#xff0c;ArkT…

Redis 主从复制,哨兵模式,集群

目录 主从复制 主从复制 作用 缺陷 主从复制流程 实现Redis主从复制 哨兵模式 主从复制切换的缺点 哨兵的核心功能 哨兵模式原理 哨兵模式的作用 哨兵结构组成 故障转移机制 主节点的选举 实现哨兵模式 集群(Cluster) redis群集有三种模式&#xff0c;主从复制…

电脑硬件 -CPU

决定性能&#xff1a;CPU&#xff0c;内存&#xff0c;显卡&#xff0c;硬盘 保证性能&#xff1a;主板&#xff0c;电源&#xff0c;CPU散热器 英特尔&#xff1a;赛扬&#xff0c;奔腾&#xff0c;酷睿&#xff0c;至强&#xff08;从低到高&#xff09; 赛扬和奔腾&#…

电荷泵如何实现升压原来

电荷泵如何实现升压原来 某芯片自举栅极驱动内部原理图迪克森电荷泵 某芯片自举栅极驱动内部原理图 迪克森电荷泵 迪克森电荷泵&#xff08;Dickson Charge Pump&#xff09;是一种电压倍增器电路&#xff0c;可以将低电压升高到较高电压&#xff0c;相对于其他电压升压电路&a…

00-JAVA基础-反射机制

反射 什么是反射 在Java中&#xff0c;反射&#xff08;Reflection&#xff09;是Java语言的一个特性&#xff0c;它允许程序在运行时检查类、接口、字段和方法的信息。通过反射&#xff0c;Java代码能够动态地创建对象、调用方法、改变字段的值等&#xff0c;而无需在编译时…

debian的使用笔记

1. XP风格任务栏 安装 debian-live-12.5.0-amd64-xfce.iso 后&#xff0c;把下面的任务栏删除&#xff0c;把上面的任务栏移到下面&#xff0c;然后设置如下选项 2. 命令自动补全 sudo apt install bash-completion 3. 找不到命令 sudo apt install command-not-found sudo…

爬虫学习第一天

爬虫-1 爬虫学习第一天1、什么是爬虫2、爬虫的工作原理3、爬虫核心4、爬虫的合法性5、爬虫框架6、爬虫的挑战7、难点8、反爬手段8.1、Robots协议8.2、检查 User-Agent8.3、ip限制8.4、SESSION访问限制8.5、验证码8.6、数据动态加载8.7、数据加密-使用加密算法 9、用python学习爬…

计算机组成结构2

概念 存储系统 解决成本-速度-容量之前的矛盾问题 寄存器–cache–内存–硬盘–外存储 局部性原理 时间局部&#xff1a;相邻的时间访问同一个数据空间局部&#xff1a;相邻的空间地址会被连续访问 cache cpu与主存之间&#xff0c;命中cache后就不需要访问主存&#xff0c;…

C++相关概念和易错语法(3)(类的声明和定义、空指针分析、this指针)

1.类的声明和定义 注意类的声明和定义分离的时候&#xff0c;在定义处要使用域作用限定符&#xff0c;否则函数声明链接时的定位不到函数的定义。 这些成员变量、函数的作用于这个类域&#xff0c;将功能集成在一起&#xff0c;这体现出封装的思想。 在区分类的定义和声明时&…

Vue3_2024_7天【回顾上篇watch常见的后两种场景】___续

Vue3中监听多条数据的两种使用 1.watch【使用上一章写法&#xff0c;监听两个属性&#xff0c;然后执行相应操作…】 2.watchEffect【相对于使用watch&#xff0c;watchEffect默认页面初始加载&#xff0c;有点类似加配置&#xff1a;立即执行 immediate】 代码&#xff1a; …

这个故事有点长 - 东方绿舟

这个故事有点长 - 东方绿舟 这个地方很大&#xff0c;游玩一天是没有问题。东方绿舟的1号门入口处&#xff0c;是一个人工瀑布&#xff0c;上边写着东方绿舟几个大字。远远看去&#xff0c;这个瀑布非常壮观&#xff0c;水的流淌让人感到凉爽&#xff0c;很适合在那里拍照打卡。…

使用注意力机制的 LSTM 彻底改变时间序列预测

目录 一、说明二、LSTM 和注意力机制简介三、为什么要将 LSTM 与时间序列注意力相结合&#xff1f;四、模型架构训练与评估 五、验证六、计算指标七、结论 一、说明 在时间序列预测领域&#xff0c;对更准确、更高效的模型的追求始终存在。深度学习的应用为该领域的重大进步铺…

喜讯 ChatGPT 3.5 免登录|免注册就可以使用了

https://chat.openai.com/ 直接访问openai 官网直接使用&#xff0c;当然还是要魔法的&#xff0c;不用再去用别人二次开发的&#xff0c;还有次数限制&#xff0c;还有开会员&#x1f605;才能用的。&#x1f600;试用啦一下&#xff0c;基本秒回答&#xff0c;能力也是在线的…

【Python】无法将“pip”项识别为 cmdlet、函数、脚本文件或可运行程序的名称解决方案

【Python】无法将“pip”项识别为 cmdlet、函数、脚本文件或可运行程序的名称解决方案 大家好 我是寸铁&#x1f44a; 总结了一篇【Python】无法将“pip”项识别为 cmdlet、函数、脚本文件或可运行程序的名称解决方案✨ 喜欢的小伙伴可以点点关注 &#x1f49d; 前言 今天寸铁…

渗透测试练习题解析 5(CTF web)

1、[安洵杯 2019]easy_serialize_php 1 考点&#xff1a;PHP 反序列化逃逸 变量覆盖 【代码审计】 通过 GET 的方式获取参数 f 的值&#xff0c;传递给变量 function 定义一个过滤函数&#xff0c;过滤掉特定字符&#xff08;用空字符替换&#xff09; 下面的代码其实没什么用…

【Java】jdk1.8 Java代理模式,Jdk动态代理讲解(非常详细,附带class文件)

&#x1f4dd;个人主页&#xff1a;哈__ 期待您的关注 一、什么是代理模式 想要学代理模式&#xff0c;我们就要先弄清一个概念“什么是代理”&#xff1f; 在我们的现实生活中&#xff0c;你或许不少听过关于代理的名词&#xff0c;如&#xff1a;代理商。那什么又叫做代理…

Rust---复合数据类型之结构体

目录 结构体的使用输出结果 结构体简化创建结构体更新语法元组结构体单元结构体&#xff08;unit struct&#xff09;结构体中的引用使用#[derive(Debug)]再次介绍 代码综合展示 与元组不同的是&#xff0c;结构体可以为内部的每个字段起一个富有含义的名称&#xff0c;因此无需…