zustand:基于 Flux 模型实现的小型、快速和可扩展的状态管理

news2025/1/23 9:20:15

目录

  • React
        • Step 1:安装
        • Step 2:Store 初始化
        • Step3:Store 绑定组件,就完成了!
        • 效果图
  • Vue
        • Step 1: 安装
        • Step 2: Store 初始化
        • Step 3: Store 绑定组件,就完成了!
        • 效果图
  • 微前端
    • 为什么你需要 zustand-pub ?
    • 安装
    • step1:初始化状态隔离容器 pubStore (场景 A)
    • Step 2: 往隔离容器 pubStore 内填装数据 platformStore (场景 A)
    • Step 3: 获取隔离容器 pubStore 下的数据 platformStore 并绑定组件 (场景 B)

React

Step 1:安装

npm install zustand # or yarn add zustand

Step 2:Store 初始化

创建的 store 是一个 hook,你可以放任何东西到里面:基础变量,对象、函数,状态必须不可改变地更新,set 函数合并状态以实现状态更新。

// store.ts
import { create } from 'zustand'

const useStore:any = create((set:any) => ({
  count: 1,
  inc: () => set((state:any) => ({ count: state.count + 1 })),
  dec: () => set((state:any) => ({ count: state.count - 1 }))
}))


export { useStore };

Step3:Store 绑定组件,就完成了!

<!--app.tsx-->
<Counter></Counter>
<!--count-->
<div style={{ display: "flex", gap: "10px" }}>
  <Incer></Incer>
  <Decer></Decer>
</div>
// dec.tsx
import "./dec.css";
import { useStore } from "../../store.ts";

function Counter() {
  const { count, dec } = useStore();
  return (
    <>
      <button onClick={() => dec()}>decrease: count is {count}</button>
    </>
  );
}

export default Counter;

// inc.tsx
import "./dec.css";
import { useStore } from "../../store.ts";

function Counter() {
  const { count, dec } = useStore();
  return (
    <>
      <button onClick={() => dec()}>decrease: count is {count}</button>
    </>
  );
}

export default Counter;

效果图

效果图

Vue

Step 1: 安装

npm install zustand-vue # or yarn add zustand-vue

Step 2: Store 初始化

//store.ts
import create from "zustand-vue";

const useStore:any = create((set:any) => ({
  count: 1,
  inc: () => set((state:any) => ({ count: state.count + 1 })),
  dec: () => set((state:any) => ({ count: state.count - 1 }))
}))


export { useStore };

Step 3: Store 绑定组件,就完成了!

<!--app.vue-->
<Counter />
<!--counter.vue-->
<div style="display: flex;gap: 10px;">
    <Incer></Incer>
    <Decer></Decer>
</div>
<!--Dec.vue-->
<script setup lang="ts">
	import { useStore } from '../store';
	
	const count = useStore((state: any) => state.count);
	const dec = useStore((state: any) => state.dec);
</script>

<template>
  <button @click="dec()">decrease: count is {{ count }}</button>
</template>

<!--Inc.vue-->
<script setup lang="ts">
	import { useStore } from '../store';
	
	const count = useStore((state:any) => state.count)
	const inc = useStore((state:any) => state.inc);
</script>

<template>
  <button @click="inc()">increase: count is {{ count }}</button>
</template>

效果图

效果图

微前端

zustand也可用于微前端:zustand-pub

zustand-pub 为 Iframe、微前端、Module Fedetation、模块化、组件化 等业务场景,提供跨应用、跨框架的状态管理及状态共享能力。

为什么你需要 zustand-pub ?

1、跨组件、跨应用通信的另一种方案:应用/组件(也可以理解为支持跨应用场景) 间可以相互调用/修改 state,并触发组件渲染,
如果你是iframe,则可以抛弃掉难维护的postMessage + addeventlistener + action了,
如果你是微前端,也不再需要eventCenter + action了,直接通过状态管理中的 action 行为修改 state 即可。
2、应用/组件间状态可以被缓存:包括 iframe、微前端等场景,当你的应用被内嵌时,不再需要重新请求/处理状态。
3、提升组件库中直接引用全局状态管理的可行性: 平时我们在业务组件引用全局 store 时会导致该组件换一个应用无法复用的问题,降低了组件的可复用性,而基于zustand-pub则不会再存在此类问题,复用性与开发效率并存。
4、提升 store 模块化管理的可行性,减少重复代码:以往模块化管理的 store,在不同仓库(应用)下复用时,状态无法同步更新,而基于zustand-pub 模块化管理的 store,状态将能够同步更新,提升了研发过程中 store 逻辑复用的可行性及研发效率。
5、预请求:某些 iframe / 微前端 场景因为接口请求过多导致页面渲染慢的,可以基于该方案进行子应用状态预请求,优化用户体验
6、调试体验好:基于 devtools 可以 同时调试/追踪多个应用间的 store,能够极大地降低应用间通信时的调试难度。
7、迁移成本低:如果你正在使用 zustand 或 zustand-vue,那么使用 zustand-pub 将很简单。

安装

npm install zustand-pub # or yarn add zustand-pub

step1:初始化状态隔离容器 pubStore (场景 A)

//index,js
import PubStore from 'zustand-pub'

const pubStore = new PubStore('key')

Step 2: 往隔离容器 pubStore 内填装数据 platformStore (场景 A)

// vue
import create from "zustand-vue";

//react
// import create from "zustand";

interface IState {
  appInfo: {
    name: string
  }
}

interface IAction {
  setAppName: (val: string) => void
}

const platformStore = pubStore.defineStore<IState & IAction>('platformStore', (set) => ({
  appInfo: { name: '' },
  setAppName(val: string) {
    set({
      appInfo: {
        name: val
      }
    })
  }
}))

const usePlatformStore = create(platformStore)

返回值 usePlatformStore 为 hook,场景 A 下,可通过状态 selector 获取对应状态

// vue3
<template>
  <div>{name}</div>
</template>

<script>
const name = usePlatformStore((state) => state.appInfo.name);
const setAppName = usePlatformStore((state) => state.setAppName);

export default {
  name: "AppA",
  data(){
    return {
      name
    }
  },
  methods:{
    setAppName
  }
}
</script>


// react
// function AppA() {
//   const name = usePlatformStore((state) => state.appInfo.name);
//   const setAppName = usePlatformStore((state) => state.setAppName);
//   return <div>{name}</div>
// }

Step 3: 获取隔离容器 pubStore 下的数据 platformStore 并绑定组件 (场景 B)

// vue3
<template>
  <div>{name}</div>
</template>

<script setup lang="ts">

interface IState {
  appInfo: {
    name: string
  }
}

interface IAction {
  setAppName: (val: string) => void
}

import PubStore from "zustand-pub";
import create from "zustand-vue";

const pubStore = new PubStore('key')
const store = pubStore.getStore<IState & IAction>("platformStore");
const usePlatformStore = create(store || {});

const name = usePlatformStore((state) => state.appInfo.name);
const setAppName = usePlatformStore((state) => state.setAppName);

</script>

// react
// import PubStore from "zustand-pub";
// import create from "zustand";

// const pubStore = new PubStore('key')
// const store = pubStore.getStore<IState & IAction>("platformStore");
// const usePlatformStore = create(store || {});

// function AppB() {
//  const name = usePlatformStore((state) => state.appInfo.name);
//  const setAppName = usePlatformStore((state) => state.setAppName);
//  return <div>{name}</div>
// }

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

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

相关文章

使用基于jvm-sandbox的对三层嵌套类型的改造

使用基于jvm-sandbox的对三层嵌套类型的改造 问题背景 先简单介绍下基于jvm-sandbox的imock工具&#xff0c;是Java方法级别的mock&#xff0c;操作就是监听指定方法&#xff0c;返回指定的mock内容。 jvm-sandbox 利用字节码操作和自定义类加载器的技术&#xff0c;将原始方法…

【RabbitMQ与SpringBoot集成测试收发消息】

【RabbitMQ与SpringBoot集成测试收发消息】 一、环境说明二、实验步骤三、小结 一、环境说明 安装环境&#xff1a;虚拟机VMWare Centos7.6 Maven3.6.3 JDK1.8RabbitMQ版本&#xff1a;rabbitmq-server-3.8.8-1.el7.noarch.rpm编程工具Idea 运行JDK为17 二、实验步骤 在Rab…

无货源多功能跨境商城智能搭建--软件制作+程序开发

随着全球电子商务的快速发展&#xff0c;跨境贸易已经成为一种新的商业趋势。在这个背景下&#xff0c;建立一个多功能跨境人工智能商城数据处理平台&#xff0c;不仅可以提高跨境电商的运营效率&#xff0c;还可以增强用户的购物体验&#xff0c;进一步推动跨境贸易的发展。本…

LinuxC编程——进程

目录 一、概念1.1 程序1.2 进程 二、特点⭐⭐⭐三、进程段四、进程分类五、进程状态六、进程状态转换图七、函数接口1. 创建子进程2. 回收进程资源3. 退出进程4. 获取进程号 八、守护进程 一、概念 进程和程序是密不可分的两组概念&#xff0c;相对比&#xff0c;便于理解。 1.…

春秋云镜 CVE-2022-21661

春秋云镜 CVE-2022-21661 wordpress < 5.8.3 存在sql注入漏洞 靶标介绍 2022年1月6日&#xff0c;wordpress发布了5.8.3版本&#xff0c;修复了一处核心代码WP_Query的sql注入漏洞。WP_Query是wordpress定义的一个类&#xff0c;允许开发者编写自定义查询和使用不同的参数…

安装Ubuntu,创建分区时无EFI系统分区选项的解决方法

电脑型号&#xff1a;联想小新Air2021 操作系统&#xff1a;windows10 硬盘&#xff1a;一块512G固态 如题&#xff0c;安装Ubuntu&#xff0c;在创建分区时&#xff0c;“用于”栏 没有“EFI系统分区”选项&#xff0c;导致在重启电脑后&#xff0c;发现直接进了Windows系统…

STM32芯片的内部架构介绍

STM32芯片由内核和片上外设两部分组成。STM32F103采用Cortex-M3内核&#xff0c;该内核由ARM公司设计。芯片生产厂商ST则负责在内核之外设计部件并生产整个芯片。这些内核之外的部件被称为核外外设或片上外设&#xff0c;如GPIO、USART&#xff08;串口&#xff09;、I2C、SPI等…

Cookie和Session详解及区别

目录 1&#xff0c;会话跟踪技术的概述 2&#xff0c;Cookie 2.1 Cookie的基本使用 1.概念 2.Cookie的工作流程 3.Cookie的基本使用 3.1 发送Cookie 3.2 获取Cookie 3.3设置Cookie存活时间 3&#xff0c;Session 3.1 Session的基本使用 3.2Session销毁 4.cookie和s…

plt绘制实测值与预测值的散点图

# -*- coding: utf-8 -*- import numpy as np import matplotlib.pyplot as plt from matplotlib.pyplot import MultipleLocator""" 输出观测值和模型预测值之间的拟合曲线,即拟合模型 决定系数R2&#xff0c;有拟合曲线公式&#xff0c;有1:1线 ""&…

笔记顶顶顶顶

这里写目录标题 基础**1. 说下计算机网络体系结构****2. OSI七层模型各自的功能是什么&#xff1f;**3. **说一下每一层对应的网络协议有哪些&#xff1f;**4. 那么数据在各层之间是怎么传输的呢&#xff1f; 应用层5. 从浏览器地址栏输入 url 到显示主页的过程&#xff1f;6. …

【24择校指南】南京大学计算机考研考情分析

南京大学(A) 考研难度&#xff08;☆☆☆☆☆&#xff09; 内容&#xff1a;23考情概况&#xff08;拟录取和复试分数人数统计&#xff09;、院校概况、23初试科目、23复试详情、参考书目、各科目考情分析、各专业考情分析。 正文2178字&#xff0c;预计阅读&#xff1a;6分…

计算机基础知识二

1、八进制 逢八进一。用8个计数符号表示&#xff0c;0、1、2、3、4、5、6、7。 2、八进制转二进制 规则&#xff1a;3位二进制转换1位八进制数。1位八进制数转换3位二进制数。 例如&#xff1a; 10011101B , 0.1101010011B 转换成八进制数。 3、十六进制 用16个计数符号0、1、…

【刷题笔记8.10】LeetCode题目:有效括号

LeetCode题目&#xff1a;有效括号 1、题目描述&#xff1a; 给定一个只包括 ‘(’&#xff0c;‘)’&#xff0c;‘{’&#xff0c;‘}’&#xff0c;‘[’&#xff0c;‘]’ 的字符串 s &#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必须用相同…

深度学习阶段性回顾

本文针对过去两周的深度学习理论做阶段性回顾&#xff0c;学习资料来自吴恩达老师的2021版deeplearning.ai课程&#xff0c;内容涵盖深度神经网络改善一直到ML策略的章节。视频链接如下&#xff1a;吴恩达深度学习视频链接 &#xff08;注&#xff1a;本文出自深度学习初学者&a…

SAP ABAP 批量CC01 创建ECN的物料和BOM 清单(RFC: CCAP_ECN_CREATE)

效果如下&#xff1a; 源代码&#xff1a; *&---------------------------------------------------------------------* *& Report ZCYCLE054 *&---------------------------------------------------------------------* *&批量CC01 *&----------------…

docker的服务/容器缺少vim问题

背景/问题&#xff1a; docker的服务/容器缺少vim问题 在docker的mysql服务中安装Vim 1、执行apt-get update root6d8d17e320a0:/# apt-get update问题:文件下载失败 Err:1 http://security.debian.org/debian-security buster/updates InRelease Temporary failure resolv…

MyBatis的XML配置文件

Mybatis的开发有两种方式&#xff1a; 注解 XML配置文件 通过XML配置文件的形式来配置SQL语句&#xff0c;这份儿XML配置文件在MyBatis当中也称为XML映射文件。 导学&#xff1a;在MyBatis当中如何来定义一份儿XML映射文件&#xff1f; 在MyBatis当中&#xff0c;定义XML…

uniapp文件下载并预览

大概就是这样的咯&#xff0c;文件展示到页面上&#xff0c;点击文件下载并预览该文件&#xff1b; 通过点击事件handleDownLoad(file.path)&#xff0c;file.path为文件的地址&#xff1b; <view class"files"><view class"cont" v-for"(…

MD-MTSP:光谱优化算法LSO求解多仓库多旅行商问题MATLAB(可更改数据集,旅行商的数量和起点)

一、光谱优化算法LSO 光谱优化算法&#xff08;Light Spectrum Optimizer&#xff0c;LSO&#xff09;由Mohamed Abdel-Basset等人于2022年提出。 参考文献&#xff1a; [1]Abdel-Basset M, Mohamed R, Sallam KM, Chakrabortty RK. Light Spectrum Optimizer: A Novel Physi…

数据结构 — 时间复杂度、空间复杂度

前言 数据结构_空间复杂度_时间复杂度讲解_常见复杂度对比 本文介绍数据结构中的时间复杂度和空间复杂度 ***文章末尾&#xff0c;博主进行了概要总结&#xff0c;可以直接看总结部分*** 博主博客链接&#xff1a;https://blog.csdn.net/m0_74014525 点点关注&#xff0c;后期…