当前位置: 首页 > news >正文

Pinia 和 Vuex 的对比

目录

  • 1,Pinia 介绍
  • 2,和 Vuex 的对比
  • 3,storeToRefs 源码分析

1,Pinia 介绍

官网简介

Pinia 使用上的问题,官方文档很详细,这里不做赘述。

  1. Pinia 是 Vue 的专属状态管理库,支持vue2和vue3,不能应用于其他前端框架。
  2. Pinia 是 Vue 官方团队的成员实现的,原本是为了探索 vue5.x 的可能性,后来发现已经实现了 vue5.x 的提案。所以就作为最新版本的 Vuex ,也就是下一代状态管理库来使用了。

2,和 Vuex 的对比

  1. 删除了 mutations ,只保留了 stategettersactions异步修改 state 现在可以放到 actions 中了。
  2. 不再有模块嵌套,只有 store(状态仓库)的概念,store 之间独立又可相互调用。
  3. 支持插件扩展,比如为 store 新增属性或方法,操作 action 等。
  4. 因为 Pinia 使用 TS 开发的,所以对 TS 有很好的支持。
  5. 兼容 vue2 和 vue3,同时支持选项式风格和组合式风格。
  6. 轻量,压缩后体积只有 1kb 左右。

在使用上,同样应避免直接操作 store,尽量都集中使用 actions 中的方法来操作 store 的状态。

3,storeToRefs 源码分析

在组件中使用 store 的属性时,会有一个问题:

<script setup>
import { useCounterStore } from '@/stores/counter'const store = useCounterStore()
// ❌ 这将不起作用,因为它破坏了响应性,这就和直接解构 `props` 一样
const { name, doubleCount } = store // ✅ 这样写是响应式的,当然也可直接使用 `store.doubleCount`
const doubleValue = computed(() => store.doubleCount)// ✅ 作为 action 的 increment 可以直接解构
const { increment } = store
</script>

这时需要使用 storeToRefs(),它将为每一个响应式属性创建引用。

<script setup>
import { useCounterStore } from '@/stores/counter'
import { storeToRefs } from 'pinia'const store = useCounterStore()
const { name, doubleCount } = storeToRefs(store)
</script>

源码

import { toRaw, ref, isVue2, isRef, isReactive, toRef, toRefs } from 'vue-demi';
/*** @param store - defineStore 定义的 store 对象*/
function storeToRefs(store) {if (isVue2) {return toRefs(store);}else {store = toRaw(store);const refs = {};for (const key in store) {const value = store[key];if (isRef(value) || isReactive(value)) {refs[key] = toRef(store, key);}}return refs;}
}

原理其实很简单,我们在解构 props 时,直接解构也会失去响应式。需要使用 toRef 与其源属性保持同步。

所以 storeToRefs 的原理:遍历 store 中的响应式属性(跳过了 action),并使用 toRef 处理后返回新对象,这样解构新对象得到的属性会和 store 的源属性保持同步,而不失去响应式。

const store1 = reactive({a: ref(1),
});
const store2 = toRaw(store1);
const _a = toRef(store2, "a");
_a.value++;
console.log(store1.a); // 2

以上。

相关文章:

  • 构建智能医患沟通:陪诊小程序开发实战
  • 不存在类型变量 A, T 的实例,使 Collector<T, A, List<T>> 符合 Supplier<R>
  • Django 入门学习总结3
  • 使用 PowerShell 创建共享目录
  • 2023亚太杯数学建模思路 - 案例:粒子群算法
  • 【Redis篇】简述Java中操作Redis的方法
  • 【广州华锐互动】昆虫3D虚拟动态展示:探索神奇的微观世界
  • jjwt使用说明-笔记
  • win10 怎么进入cmd窗口
  • VBA技术资料MF85:将工作簿批量另存为PDF文件
  • django ModelSerializer自定义显示字段
  • msvcp140.dll是什么?msvcp140.dll丢失的有哪些解决方法
  • 90.子集II
  • Linux中的进程程序替换
  • 点云从入门到精通技术详解100篇-基于点云数据的机器人装焊 过程在线测量(下)
  • 收藏网友的 源程序下载网
  • 「前端早读君006」移动开发必备:那些玩转H5的小技巧
  • gf框架之分页模块(五) - 自定义分页
  • MySQL的数据类型
  • Odoo domain写法及运用
  • Python_OOP
  • Redis在Web项目中的应用与实践
  • Sequelize 中文文档 v4 - Getting started - 入门
  • SpiderData 2019年2月13日 DApp数据排行榜
  • Vue 2.3、2.4 知识点小结
  • 力扣(LeetCode)357
  • 力扣(LeetCode)965
  • 如何优雅的使用vue+Dcloud(Hbuild)开发混合app
  • 微服务入门【系列视频课程】
  • 想使用 MongoDB ,你应该了解这8个方面!
  • 小程序button引导用户授权
  • 用 Swift 编写面向协议的视图
  • 《天龙八部3D》Unity技术方案揭秘
  • PostgreSQL 快速给指定表每个字段创建索引 - 1
  • 没有任何编程基础可以直接学习python语言吗?学会后能够做什么? ...
  • ​MySQL主从复制一致性检测
  • ​比特币大跌的 2 个原因
  • #Java第九次作业--输入输出流和文件操作
  • #pragma once与条件编译
  • (1)(1.11) SiK Radio v2(一)
  • (3)(3.2) MAVLink2数据包签名(安全)
  • (MonoGame从入门到放弃-1) MonoGame环境搭建
  • (考研湖科大教书匠计算机网络)第一章概述-第五节1:计算机网络体系结构之分层思想和举例
  • (亲测)设​置​m​y​e​c​l​i​p​s​e​打​开​默​认​工​作​空​间...
  • (五)Python 垃圾回收机制
  • (一)eclipse Dynamic web project 工程目录以及文件路径问题
  • .[hudsonL@cock.li].mkp勒索病毒数据怎么处理|数据解密恢复
  • .bat批处理(十):从路径字符串中截取盘符、文件名、后缀名等信息
  • .NET CORE 第一节 创建基本的 asp.net core
  • .NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划
  • .net websocket 获取http登录的用户_如何解密浏览器的登录密码?获取浏览器内用户信息?...
  • .NET 的程序集加载上下文
  • .net 无限分类
  • .NET项目中存在多个web.config文件时的加载顺序
  • .NET中的Event与Delegates,从Publisher到Subscriber的衔接!