zustand状态管理器使用汇总

2023-11-30 22:20

本文主要是介绍zustand状态管理器使用汇总,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1. 初步使用介绍

// 1. 安装zustand
npm install zustand// 2. 创建store使用
import { create } from "zustand";
export const useBearStore = create((set) => ({bears: 0, increasePopulation: () => set((state) => ({ bears: state.bears + 1 })), removeAllBears: () => set({ bears: 0 }),
}));// 3. 组件内使用
import {useBearStore} from './store/index.js';function App() {// 不建议的写法:(除非状态都要使用到,否则建议使用下方写法,理由是会一直触发渲染导致性能差)// const {bears, increasePopulation} = useBearStore();// 支持写法const bears = useBearStore(state => state.bears);const increasePopulation = useBearStore(state => state.increasePopulation);const handleClick = () => {increasePopulation();}return (<div className="App">{bears}<button onClick={handleClick}>按钮</button></div>);
}export default App;

2. zustand内get与set使用

// 1. store
import { create } from "zustand";
export const useBearStore = create((set, get) => ({bears: 0,count: 0,increasePopulation: () => set((state) => ({ bears: state.bears + 1 })),increaseCount: () => set((state) => ({ count: state.count + 1 })),removeAllBears: () => set({ bears: 0 }),total: () => {// get()可以获取到state状态里的数据return get().bears + get().count}
}));// 2. 组件使用import { useBearStore } from './store/index.js';function App() {const bears = useBearStore(state => state.bears);const count = useBearStore(state => state.count);// 使用set使bears+1const increasePopulation = useBearStore(state => state.increasePopulation);// 使用set使count+1const increaseCount = useBearStore(state => state.increaseCount);// 使用get获取bears+countconst total = useBearStore(state => state.total);const handleClickBears = () => {increasePopulation();}const handleClickCount = () => {increaseCount();}return (<div className="App"><div>{bears}</div><div>{count}</div><button onClick={handleClickBears}>按钮bears</button><button onClick={handleClickCount}>按钮count</button>{/* 汇总 */}<div>{total()}</div></div>);
}export default App;

3. selector使用

// 1. 创建一个ts文件
import { StoreApi, UseBoundStore } from 'zustand'type WithSelectors<S> = S extends { getState: () => infer T }? S & { use: { [K in keyof T]: () => T[K] } }: neverconst createSelectors = <S extends UseBoundStore<StoreApi<object>>>(_store: S
) => {let store = _store as WithSelectors<typeof _store>store.use = {}for (let k of Object.keys(store.getState())) {;(store.use as any)[k] = () => store((s) => s[k as keyof typeof s])}return store
}export default createSelectors;// 2. store使用
import { create } from "zustand";
import createSelectors from './index.ts';// 在store内使用
export const useBearStore = createSelectors(create((set, get) => ({bears: 0,count: 0,increasePopulation: () => set((state) => ({ bears: state.bears + 1 })),increaseCount: () => set((state) => ({ count: state.count + 1 })),removeAllBears: () => set({ bears: 0 }),total: () => {// get()可以获取到state状态里的数据return get().bears + get().count}
})));// 3. 组件内使用,提高性能
import { useBearStore } from './store/index.js';// count发生改变时这个组件才会渲染, 否则不会, 增加性能
function Child() {const count = useBearStore(state => state.count);return (<div><div>{count}</div><div>{Math.random()}</div></div>)
}// 单独在组件内使用这个selectore
function Some() {const { bears, count } = useBearStore();const increasePopulation = useBearStore.use.increasePopulation();const increaseCount = useBearStore.use.increaseCount();const handleClickBears = () => {increasePopulation();}const handleClickCount = () => {increaseCount();}return (<div className="App"><div>{bears}</div><div>{count}</div><button onClick={handleClickBears}>按钮bears</button><button onClick={handleClickCount}>按钮count</button></div>);
}// 一定要封装独立组件, 否则使用后也会重复渲染
function App() {return (<div className="App"><Some /><Child /></div>);
}export default App;

这篇关于zustand状态管理器使用汇总的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/438762

相关文章

Java使用ANTLR4对Lua脚本语法校验详解

《Java使用ANTLR4对Lua脚本语法校验详解》ANTLR是一个强大的解析器生成器,用于读取、处理、执行或翻译结构化文本或二进制文件,下面就跟随小编一起看看Java如何使用ANTLR4对Lua脚本... 目录什么是ANTLR?第一个例子ANTLR4 的工作流程Lua脚本语法校验准备一个Lua Gramm

Java Optional的使用技巧与最佳实践

《JavaOptional的使用技巧与最佳实践》在Java中,Optional是用于优雅处理null的容器类,其核心目标是显式提醒开发者处理空值场景,避免NullPointerExce... 目录一、Optional 的核心用途二、使用技巧与最佳实践三、常见误区与反模式四、替代方案与扩展五、总结在 Java

使用Java将DOCX文档解析为Markdown文档的代码实现

《使用Java将DOCX文档解析为Markdown文档的代码实现》在现代文档处理中,Markdown(MD)因其简洁的语法和良好的可读性,逐渐成为开发者、技术写作者和内容创作者的首选格式,然而,许多文... 目录引言1. 工具和库介绍2. 安装依赖库3. 使用Apache POI解析DOCX文档4. 将解析

Qt中QUndoView控件的具体使用

《Qt中QUndoView控件的具体使用》QUndoView是Qt框架中用于可视化显示QUndoStack内容的控件,本文主要介绍了Qt中QUndoView控件的具体使用,具有一定的参考价值,感兴趣的... 目录引言一、QUndoView 的用途二、工作原理三、 如何与 QUnDOStack 配合使用四、自

C++使用printf语句实现进制转换的示例代码

《C++使用printf语句实现进制转换的示例代码》在C语言中,printf函数可以直接实现部分进制转换功能,通过格式说明符(formatspecifier)快速输出不同进制的数值,下面给大家分享C+... 目录一、printf 原生支持的进制转换1. 十进制、八进制、十六进制转换2. 显示进制前缀3. 指

使用Python构建一个Hexo博客发布工具

《使用Python构建一个Hexo博客发布工具》虽然Hexo的命令行工具非常强大,但对于日常的博客撰写和发布过程,我总觉得缺少一个直观的图形界面来简化操作,下面我们就来看看如何使用Python构建一个... 目录引言Hexo博客系统简介设计需求技术选择代码实现主框架界面设计核心功能实现1. 发布文章2. 加

SQL server配置管理器找不到如何打开它

《SQLserver配置管理器找不到如何打开它》最近遇到了SQLserver配置管理器打不开的问题,尝试在开始菜单栏搜SQLServerManager无果,于是将自己找到的方法总结分享给大家,对SQ... 目录方法一:桌面图标进入方法二:运行窗口进入方法三:查找文件路径方法四:检查 SQL Server 安

shell编程之函数与数组的使用详解

《shell编程之函数与数组的使用详解》:本文主要介绍shell编程之函数与数组的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录shell函数函数的用法俩个数求和系统资源监控并报警函数函数变量的作用范围函数的参数递归函数shell数组获取数组的长度读取某下的

使用Python开发一个带EPUB转换功能的Markdown编辑器

《使用Python开发一个带EPUB转换功能的Markdown编辑器》Markdown因其简单易用和强大的格式支持,成为了写作者、开发者及内容创作者的首选格式,本文将通过Python开发一个Markd... 目录应用概览代码结构与核心组件1. 初始化与布局 (__init__)2. 工具栏 (setup_t

Python虚拟环境终极(含PyCharm的使用教程)

《Python虚拟环境终极(含PyCharm的使用教程)》:本文主要介绍Python虚拟环境终极(含PyCharm的使用教程),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录一、为什么需要虚拟环境?二、虚拟环境创建方式对比三、命令行创建虚拟环境(venv)3.1 基础命令3