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

目录

  • 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.mzph.cn/news/31160.shtml

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

相关文章

Centos8上加速git clone

首先通过命令获取域名对应的IP地址 [rootggbond ~]# nslookup github.global.ssl.fastly.net [rootggbond ~]# nslookup github.com 之后如上获取到的IP地址 以IP-域名的格式加入到hosts文件中 [rootggbond ~]# vim /etc/hosts Centos8上更新DNS缓存 [rootggbond ~]# nscd -…

R语言5_安装Giotto

环境Ubuntu22/20, R4.1. 已开启科学上网。 第一步&#xff0c;更新服务器环境&#xff0c;进入终端&#xff0c;键入如下命令&#xff0c; apt-get update apt install libcurl4-openssl-dev libssl-dev libxml2-dev libcairo2-dev libgtk-3-dev libhdf5-dev libmagick9-dev …

opencv基础55-获取轮廓的特征值及示例

轮廓自身的一些属性特征及轮廓所包围对象的特征对于描述图像具有重要意义。本节介绍几个轮廓自身的属性特征及轮廓所包围对象的特征。 宽高比 可以使用宽高比&#xff08;AspectRation&#xff09;来描述轮廓&#xff0c;例如矩形轮廓的宽高比为&#xff1a; 宽高比 宽度&am…

消息队列比较

、ActiveMQ 优点&#xff1a;单机吞吐量万级&#xff0c;时效性ms级&#xff0c;可用性高&#xff0c;基于主从架构实现高可用性&#xff0c;消息可靠性较低的概率丢失数据。 缺点&#xff1a;官方社区现在对ActiveMQ5.X维护越来越少了&#xff0c;高吞吐量场景较少使用。 2、K…

htmlCSS-----案例展示

目录 前言 作品效果 html代码 CSS代码 图片资源 前言 在学习html过程中我们要试着去写写一些案例&#xff0c;通过这些案例让我们更加熟悉代码以及丰富我们的经验&#xff0c;下面是我个人写的一个案例&#xff0c;代码和图片也给出了大家&#xff0c;你们可以参考参考。…

linux cp -rpf指令

cp -rpf #强行递归复制/etc目录到/mist目录中&#xff0c;并保持源目录的权限等信息不变。 有点类似于打patch&#xff0c;不会改变已有的内容。

C++笔记之将定时器加入向量并设置定时器的ID为i

C笔记之将定时器加入向量并设置定时器的ID为i code review! 文章目录 C笔记之将定时器加入向量并设置定时器的ID为i关于代码中的void operator()() 运行 代码 #include <chrono> #include <iostream> #include <thread> #include <vector>// 定义定时…

预测性维护如何改变设备管理部门的工作方式?

在现代工业中&#xff0c;设备管理部门面临着日益复杂的挑战。维护工作的准确性和高效性变得愈发重要&#xff0c;特别是在资产技术日益复杂的背景下。预测性维护&#xff08;PdM&#xff09;作为一种革命性的方法&#xff0c;通过实时评估运营数据并利用人工智能&#xff08;A…

Linux固件子系统的实现机制简介

一、Linux固件子系统概述 固件是硬件设备自身执行的一段程序。固件一般存放在设备flash内。而出于成本和便利性的考虑&#xff0c;通常是先将硬件设备的运行程序打包为一个特定格式的固件文件&#xff0c;存储到终端系统内&#xff0c;通过终端系统给硬件设备进行升级。Linux内…

Mask RCNN网络结构以及整体流程的详细解读

文章目录 1、概述2、Backbone3、RPN网络3.1、anchor的生成3.2、anchor的标注/分配3.3、分类预测和bbox回归3.4、NMS生成最终的anchor 4、ROI Head4.1、ROI Align4.2、cls head和bbox head4.3、mask head 1、概述 Mask RCNN是在Faster RCNN的基础上增加了mask head用于实例分割…

HBase-组成

client 读写请求HMaster 管理元数据监控region是否需要进行负载均衡&#xff0c;故障转移和region的拆分RegionServer 负责数据cell的处理&#xff0c;例如写入数据put&#xff0c;查询数据get等 拆分合并Region的实际执行者&#xff0c;由Master监控&#xff0c;由regionServ…

Stable Diffusion WebUI安装和使用教程(Windows)

目录 下载Stable Diffusion WebUI运行安装程序&#xff0c;双击webui.bat界面启动插件安装&#xff08;github&#xff09;模型下载(有些需要魔法&#xff09;安装过程遇到的大坑总结参考的博客 整个过程坑巨多&#xff0c;我花了一个晚上的时间才全部搞定,本教程针对有编程基础…

vue 设置了表单验证的el-input,在触发验证后无法继续输入的问题解决

问题表现 在项目中碰到的问题&#xff0c;说是input框出现验证提示后&#xff0c;该框就无法输入新的数据了 下面是我的代码&#xff1a; // dom结构 <el-form ref"addForm" :rules"addFormRules" :model"addForm" label-width"100px&…

p5.js画布操作实战:创建,绑定指定元素,动态调整大小,隐藏滚动条,删除画布...

theme: smartblue 文章简介 之前在 《p5.js 光速入门》 里粗略讲过一下如何使用 p5.js 创建画布。 这次要介绍几个 p5.js 提供的画布相关的方法。 创建画布时的相关配置。让画布绑定指定元素。重置画布大小。删除画布。 学习本文前你需要具备一点 p5.js 的知识&#xff0c;想了…

基于PyTorch的图像识别

前言 图像识别是计算机视觉领域的一个重要方向&#xff0c;具有广泛的应用场景&#xff0c;如医学影像诊断、智能驾驶、安防监控等。在本项目中&#xff0c;我们将使用PyTorch来开发一个基于卷积神经网络的图像识别模型&#xff0c;用来识别图像中的物体。下面是要识别的四种物…

k8s 自身原理 2

前面我们说到 K8S 的基本原理和涉及的四大组件&#xff0c;分享了前两个组件 etcd 和 ApiServer 这一次我们接着分享一波&#xff1a; 调度器 scheduler控制器管理器 controller manager 调度器 scheduler 调度器&#xff0c;见名知意&#xff0c;用于调度 k8s 资源的&…

数据结构—图的遍历

6.3图的遍历 遍历定义&#xff1a; ​ 从已给的连通图中某一顶点出发&#xff0c;沿着一些边访问遍历图中所有的顶点&#xff0c;且使每个顶点仅被访问一次&#xff0c;就叫作图的遍历&#xff0c;它是图的基本运算。 遍历实质&#xff1a;找每个顶点的邻接点的过程。 图的…

机器人CPP编程基础-04输入Input

机器人CPP编程基础-03变量类型Variables Types ……AI…… C #include<iostream> // 引入iostream库&#xff0c;这个库包含了对输入/输出进行操作所需的函数和对象 using namespace std; // 使用命名空间std&#xff0c;这样我们就可以直接使用std中的名字&#xff0c…

定制 ChatGPT 以满足您的需求 自定义说明

推荐&#xff1a;使用 NSDT场景编辑器 快速助你搭建可二次编辑的3D应用场景 20 月 <> 日&#xff0c;OpenAI 宣布他们正在引入带有自定义说明的新流程&#xff0c;以根据您的特定需求定制 ChatGPT。 什么是自定义说明&#xff1f; 新的测试版自定义指令功能旨在通过防止…

Malloc动态内存分配

在C语言中我们会使用malloc来动态地分配内存&#xff0c;这样做的一个主要理由是有些数据结构的大小只有在运行时才能确定。例如&#xff0c;如果你正在编写一个程序&#xff0c;需要用户输入一些数据&#xff0c;但你不知道用户会输入多少数据&#xff0c;那么你就需要使用动态…