React + valtio 响应式状态管理

Valtio 是一个很轻量级的响应式状态管理库。valtio 让数据管理在 React 和原生 JS (Vanilla) 中变得更加简单的一个库,它类似于 Vue 的数据驱动视图的理念,使用外部状态代理去驱动 React 视图来更新。

React + Valtio

一、状态管理库

  • dispatch 流派(单向数据流-中心化管理):reduxzustanddva
  • 响应式流派(中心化管理):mobxvaltio
  • 原子状态流派(原子组件化管理):recoiljotai

值得一提的是:JotaiZustandValtio 这三个开源状态管理库都是出自一人之手。
zustand 德语 “状态”,jotai 日语 “状态”、valtio 芬兰语 “状态”。
作者叫做 Daishi Kato,他是日本东京人,是个全职开源作者。

二、JotaiZustandValtio 使用对比

  • Zustand
import { create } from "zustand";const useStore = create((set) => ({count: 0,inc: () => set((state) => ({ count: state.count + 1 })),
}));export default function Counter() {const count = useStore((state) => state.count);const inc = useStore((state) => state.inc);return (<div>{count}<button onClick={inc}>+1</button></div>);
}
  • Jotai:每个状态都是原子化,用法和原生的 useState 有点像
import { atom, useAtom } from "jotai";const countAtom = atom(0);function Counter() {const [count, setCount] = useAtom(countAtom);return (<div>{count}<button onClick={() => setCount((v) => v + 1)}>+1</button></div>);
}
  • Valtio:和 Vue 的响应式类似,当数据发生变化的时候就驱动视图更新
const state = proxy({dur: 10,count: 1102
});
const incDur = () => {++state.dur};
const decDur = () => {--state.dur};
const incCount = () => {++state.count;setTimeout(incCount, 100 * state.dur);
};incCount();export default function Main() {const snap = useSnapshot(state)return (<div><h3>{snap.dur}</h3><buttondisabled={snap.dur <= 1}onClick={decDur}>-</button><buttondisabled={snap.dur >= 10}onClick={incDur}>+</button></div>);
}

三、Valtio 状态管理最佳实践

  1. 创建一个 store.js 文件
import { proxy } from 'valtio'
import { useProxy } from 'valtio/utils'
import { cloneDeep } from 'lodash-es'export const defaultData = {activeIndex: 0,rangeData: [5, 20],baseSelected: [],step: {1: true,2: false,3: false,4: false,5: false,6: false,},
}const state = cloneDeep(defaultData)
const store = proxy(state)export const useStore = () => {return useProxy(store)
}export function resetData() {Object.entries(defaultData).forEach(([key, value]) => {store[key] = cloneDeep(value)})
}
  1. 在组件中使用
import { useStore, resetData } from '@/store/store'const tabs = [{value: '1',label: '基础设置',},{value: '2',label: '高级设置',},{value: '3',label: '其他设置',}
]const list = [{value: '1',label: '标签'},{value: '2',label: '分类'},{value: '3',label: '作者'},
]export default function Main() {const store = useStore()useEffect(() => {return () => {// 在组件卸载的时候重置数据resetData()}}, []);function onSelect(id) {if (store.baseSelected.includes(id)) {store.baseSelected =store.baseSelected.filter((item) => item !== id)} else {if (store.baseSelected.length >= 5) returnstore.baseSelected.push(id)}}return (<div>{tabs.map(({ value, label }, index) => (<divkey={value}onClick={() => {store.activeIndex = index}}>{label}</div>))}<hr/>{list.map(({ value, label }) => (<divkey={value}onClick={() => {onSelect(value)}}>{label}</div>))}</div>);
}

useProxy 其实就是对取 useSnapshot()store 数据的封装,这个 hook 也很简单,就是判断是渲染期间(渲染体内)就返回 useSnapshot() 的快照数据,非渲染期间(非渲染体内)就返回原始的 store 数据,和我们自己手写的是差不多的,只不过这个 hook 帮我们把这个过程封装了起来。

官方文档:https://valtio.pmnd.rs/


欢迎访问:天问博客

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

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

相关文章

Flink 运行时[Runtime] 整体架构

一、基本组件栈 在Flink整个软件架构体系中&#xff0c;同样遵循着分层的架构设计理念&#xff0c;在降低系统耦合度的同时&#xff0c;也为上层用户构建Flink应用提供了丰富且友好的接口。从下图中可以看出整个Flink的架构体系基本上可以分为三层&#xff0c;由上往下依次是 …

MT6739/MTK6739安卓核心板规格参数_MTK平台核心板定制

安卓核心板采用联发科 MT6739 平台开发设计&#xff0c;搭载开放的智能 Android 操作系统。它集成 GPU PowerVR GE8100 570MHz&#xff0c;集成了 BASEBAND、UMCP、PMU 等核心器件&#xff0c;支持 2.4G5G 双频 WIFI(可支持 1*1 MIMO)、BLUETOOTH 近距离无线传输技术&#xff0…

绩效面谈-大公司提高绩效的必杀技

绩效面谈是一种人力资源管理工具&#xff0c;旨在评估员工绩效并为其提供反馈。其意义包括&#xff1a; 为提高绩效制定具体的目标和计划。通过与员工讨论绩效表现&#xff0c;管理人员和员工可以确定明确的目标和方向&#xff0c;以实现更高的绩效水平。 帮助员工理解工作环…

【组合数学】Pólya 计数理论

目录 1. 引言2. 置换群3. Burnside 引理共轭类k 不动置换类Burnside 引理 4. Plya 计数定理4.1 对点着色问题4.2 对面着色问题4.3 重复球放盒子 1. 引言 Plya 计数理论是数学中的一个分支&#xff0c;主要研究的是对称性在组合计数问题中的应用。该理论以匈牙利数学家乔治波利…

关于使用libnet时性能下降的问题分析

Libnet是一个用于构建和注入网络数据包的便携式框架。它提供了在IP层和链路层创建数据包的功能&#xff0c;以及一系列辅助和补充功能。Libnet非常适合编写网络工具和网络测试代码。一些使用libnet的项目包括arping、ettercap、ipguard、isic、nemesis、packit、tcptraceroute和…

服务器加装了14T硬盘,显示不出来,戴尔R730阵列卡配置阵列RAID0

戴尔H730阵列卡配置阵列RAID0,1,5,10_哔哩哔哩_bilibili 然后依据下面的视频进行操作&#xff0c;ctrlr&#xff0c;选raid0 戴尔H730阵列卡配置阵列RAID0,1,5,10_哔哩哔哩_bilibili

【项目问题解决】% sql注入问题

目录 【项目问题解决】% sql注入问题 1.问题描述2.问题原因3.解决思路4.解决方案1.前端限制传入特殊字符2.后端拦截特殊字符-正则表达式3.后端拦截特殊字符-拦截器 5.总结6.参考 文章所属专区 项目问题解决 1.问题描述 在处理接口入参的一些sql注入问题&#xff0c;虽然通过M…

《Python Advanced Programming + Design Patterns + Clean Code》

清洁代码 — 学习如何编写可读、可理解且可维护的代码 高级Python编程知识 Python之常用设计模式 Advanced Programming装饰器 decorators生成器 & 迭代器with 上下文管理器面向对象Mixin 模式反射机制并发编程 Design Patterns设计模式分类简单工厂模式工厂模式 √抽象工厂…

2024年软件测试工程师如何从功能测试转成自动化测试?

前言 接触了太多测试同行&#xff0c;由于多数同行之前一直做手工测试&#xff0c;现在很迫切希望做[<u>自动化测试</u>](javascript:;)&#xff0c;其中不乏工作5年以上的同行。 从事软件自动化测试已经近十年&#xff0c;接触过底层服务端、API 、Web、APP、H5…

【lesson20】MySQL复合查询(1)基本查询回顾、多表查询和自连接

文章目录 基本查询回顾建表插入数据实例 多表查询建表插入数据实例 自连接建表插入数据实例 基本查询回顾 建表 插入数据 实例 查询工资高于500或岗位为MANAGER的雇员&#xff0c;同时还要满足他们的姓名首字母为大写的J 按照部门号升序而雇员的工资降序排序 使用年薪进行降…

自动化测试工具-Selenium:WebDriver的API/方法使用全解

我们上一篇文章介绍了Selenium的三大组件&#xff0c;其中介绍了WebDriver是最重要的组件。在这里&#xff0c;我们将看到WebDriver常用的API/方法&#xff08;注&#xff1a;这里使用Python语言来进行演示&#xff09;。 1. WebDriver创建 打开VSCode&#xff0c;我们首先引…

亚马逊关键词收录逻辑是什么?亚马逊关键词收录规则——站斧浏览器

亚马逊关键词收录逻辑是什么&#xff1f; 亚马逊收录系统是静态相关性和动态相关性的结合&#xff0c;也就是listing埋词与广告或其他非常规手段的干预。发生顺序及逻辑如下&#xff1a; 第一步&#xff1a;亚马逊首先会进行静态收录。通过SEO搜索引擎来识别卖家的产品链接&a…

《每天一分钟学习C语言·六》

1、 1字节&#xff08;Byte&#xff09;8位&#xff0c;1KB1024字节&#xff0c;1M1024KB&#xff0c;1G1024MB 2、 char ch A; printf(“ch %d\n”, ch);ch为65 这里是ASCII码转换 3、 scanf("%d", &i); //一般scanf直接加输入控制符 scanf("m%d&qu…

java练习题之多态练习

1:关于多态描述错误的是(D) A. 父类型的引用指向不同的子类对象 B. 用引用调用方法&#xff0c;只能调用引用中声明的方法 C. 如果子类覆盖了父类中方法&#xff0c;则调用子类覆盖后的方法 D. 子类对象类型会随着引用类型的改变而改变 2:class Super{ public void m1(){}…

Python 输入输出, 标识符, import(保留字关键字) ,注释 , 缩进

1 Python简介输入print()标识符import关键字保留字(关键字)注释缩进 Python简介 python是一门解释性语言 解释性语言的特点:它不像java c一样先编译后执行,它是直接每一行的去执行,所以遇见错误时,它会把错误之前的执行完 输入print() print() 是一个让计算机在屏幕上进行输…

微信小程序格创校园跑腿小程序源码v1.1.64+前端

简介&#xff1a; 版本号&#xff1a;1.1.64 – 多学校版本 本次更新内容&#xff1a; 订单问题修复 &#xff08;无需上传小程序&#xff09; 版本号&#xff1a;1.1.63 – 多学校版本 本次更新内容&#xff1a; 失物招领增加内容安全接口&#xff1b; 认证增加性别选…

如何选择出最适合的backbone模型?图像分类模型性能大摸底

到2023年图像分类backbone模型已经拓展到了几十个系列&#xff0c;而有的新算法还在采样vgg、resnet做backbone&#xff0c;比如2022年提出的GDIP-YOLO还在用VGG16做IA参数预测&#xff0c;那是在浪费计算资源并限制了模型性能的提升&#xff0c;应该将目光放到现在的最新模型中…

智能优化算法应用:基于野马算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于野马算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于野马算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.野马算法4.实验参数设定5.算法结果6.参考文献7.MA…

基于ssm高校学生管理系统论文

摘 要 使用旧方法对校园活动信息进行系统化管理已经不再让人们信赖了&#xff0c;把现在的网络信息技术运用在校园活动信息的管理上面可以解决许多信息管理上面的难题&#xff0c;比如处理数据时间很长&#xff0c;数据存在错误不能及时纠正等问题。 这次开发的高校学生管理系…

UG扫掠命令

扫掠命令在下图位置&#xff1a; 扫掠的规则&#xff1a; 1、引导线必须光顺相切&#xff0c;不能有尖角 2、多个截面选择顺序不能颠倒&#xff08;三个或以上截面的时候&#xff09; 3、多个截面选择方向必须一致 4、多个截面必须节点对应 截面或引导线可以是开放或封闭的…