Vue3 中使用 Vuex 和 Pinia 对比之 Vuex的用法

本文基于 Vue3 的 composition API 来展开 Vuex 和 Pinia 的用法比较

Pinia传送门
Vuex传送门

Vuex

状态管理的核心概念

  • 状态- 驱动应用的数据源;
  • 视图 - 以声明方式将状态映射到视图;
  • 操作 - 响应在视图上的用户输入导致的状态变化

下面是源自Vuex 官网提供的,“单向数据流”的简单示意:
在这里插入图片描述
但是,我们的应用中遇到多个组件共享状态时,单向数据流的简洁性很容易被破坏:

  1. 多个视图依赖于同一个状态;
  2. 来自不同的视图的行为需要变更同一个状态。

为了解决上述两个问题,Vuex 做了如下的优化,也是Vuex 的状态管理机制:
在这里插入图片描述
Vuex 把组件的共享状态抽取出来,以一个全局单例模式管理,在这种模式下,我们的组件树构成了一个巨大的“视图”,不管在数的哪个位置,任何组件都能获取状态或者触发行为;Vuex 通过定义和隔离状态管理中的各种概念并通过强制规则维持视图和状态之间的独立性。使我们的代码变得更结构化且更易维护。

Vuex 和单纯的全局对象的区别

Vuex 的核心就是 store(仓库),可以把它看成是一个容器,存储应用中大部分的状态(state),Vuex 和单纯的全局对象存在如下区别:

  1. Vuex 的状态存储是响应式的。当Vue 组件从 store 中读取状态时,store 发生变化,那么相应的组件也会得到更新;
  2. 你不能直接修改 store 中的状态,改变store 中的状态的唯一途径是调用 commit 触发 mutation,也就是说你的 Vue 组件中只写 commit ,不要直接调用 mutation 中的方法,这样的好处是可以方便的跟踪每一个状态的变化,有利于vuedevtool 调试

Vuex 的适用场景

适用于中大型的单页应用,如果你的应用足够简单,那么不建议使用 Vuex,一个简单的 store 模式就足够用了。

Vuex 的使用-最简单的实例

步骤一:安装 Vuex

npm install vuex@next --save
或者使用 yarn:
yarn add vuex@next --save

步骤二:创建一个 store

引用 Vuex 的官方demo

import { createApp } from 'vue'
import { createStore } from 'vuex'// 创建一个新的 store 实例
const store = createStore({state () {return {count: 0}},mutations: {increment (state) {state.count++}}
})const app = createApp({ /* 根组件 */ })// 将 store 实例作为插件安装
app.use(store)

步骤三:在Vue 组件中的使用- 顺便了解一下 state

import { useStore} from "vuex";
const store = useStore();
//改变store 中某个状态的值,只需要
store.commit('increment')//通过 commit 触发状态变更,入参传入 mutation 中的函数名称即可//获取store 中的某个状态的值
//一般情况下我们使用计算属性来实现
const myCount = computed(()=> store.state.count);//需要先 import {computed} from vue 
console.log(store.state.count);//直接通过 store.state.某个状态名称 即可

注意:一定要使用 commit(‘mutation中的方法名’) 来改变 state 中的数据,不要通过store.state.count = 9 这种方式

Getter

关于state 想必通过上面的简单例子已经了解了。我们引出 getters 的概念:有时候我们需要从 store 中的 state 中的数据派生出一些状态,例如对列表进行过滤并计数功能,多个组件都要使用这个功能,如果在每个组件里都写一遍,肯定是冗余的,getters 则为我们解决了这个问题,它等效于 computed 可以任务是 store 的计算属性。

const store = createStore({state: {todos: [{ id: 1, text: '...', done: true },{ id: 2, text: '...', done: false }]},getters: {doneTodos (state) {return state.todos.filter(todo => todo.done)}}
});
//在组件中调用的方式跟 state 一样,可以通过访问属性的形式访问这些值:
store.getters.doneTodos

Mutation

上文反复提到,修改 Vuex 的 store 中的状态的唯一方法是 提交(commit)mutation。是因为Vuex 中的 mutation 非常类似于事件:每个 mutation 都有一个字符串的事件类型(type)和一个回调函数(handler)。这个回调函数就是我们实际进行状态更改的地方,并且它接受 state 作为第一个参数,第二个参数可以传入自己需要传入的数据。
我们再来回顾一下上文 步骤二中的这个片段:

const store = createStore({state: {count: 1},mutations: {increment (state) {// 变更状态state.count++}}
})

Action

上面的 Mutation 和 State 看上去已经能够满足我们对 store 的使用了啊,为什么会有 Action 这个东西呢?原因在于 Vuex 把 Mutation 中的函数设计为了 同步函数,主要是出于 devtools 的考虑。那这样的话,你可以理解 Mutation 中是不能做接口请求回调了。于是Action 就来了,它的出现主要是帮助我们处理异步操作,根据异步回调的结果然后再通过 commit 来调用 mutation 去修改想要修改的状态。
注意:Action提交的是mutation,而不是直接更改状态

const store = createStore({state: {count: 0},mutations: {increment (state) {state.count++}},actions: {increment (context) {context.commit('increment')}}
})

Action 函数接受一个与 store 实例具有相同方法和属性的 context 对象,可以调用 context.commit 提交一个 mutation,或者通过 context.state 和 context.getters 来获取 state 和 getters

总结Action 和 Mutation 的区别:

  • Action 提交的是 mutation,而不是直接更改状态;
  • Action 可以包含任意异步操作

关于 Pinia 见下一篇文章:Vue3 中使用 Vuex 和 Pinia 对比之 Pinia的用法

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

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

相关文章

进口零部件三维模型扫描替换抄数建模逆向造型设计服务CASAIM

三维扫描技术在现代制造业中发挥着越来越重要的作用,尤其在零部件建模领域,它能够快速、准确地获取物体的三维数据,为后续的逆向工程和快速原型制造提供了有力支持。 CASAIM三维扫描仪设备通过对零部件进行三维扫描,我们可以获得…

OpenHarmony4.0适配LVDS屏幕驱动

1.概述 手头有一块RK3568的开发板OK3568-C,但是还没有适配OpenHarmony,用的还是LVDS屏幕,但是官方和网上好像还没有OpenHarmony4.0的LVDS屏幕驱动的通用实现,所以决定尝试了一下适配该开发板,完成LVDS屏幕驱动的适配&…

OpenAIOps社区线上宣讲会圆满召开,期待您的加入!

2024年1月12日“OpenAIOps社区”线上宣讲会圆满召开,群体智慧协同创新社区的创立为AIOps领域未来发展注入了活力。OpenAIOps社区是一个AIOps开源社区及创新平台,由中国计算机学会(CCF)、清华大学、南开大学、中科院、国防科大、必示科技等单位共同发起&a…

Qt 三维柱状图 Q3DBar 和 三维条形图中的数据序列 QBar3DSeries

(一) 使用 Q3DBars 图形类和 QBar3DSeries 序列类可以绘制三维柱状图 窗口右侧是用 Q3DBars 和 QBar3DSeries 绘制的三维柱状图,这个图只有一个QBar3DSeries序列,数据是按行存储的,可以有多行。水平方向是行坐标轴和列坐标轴,使用…

Windows安装和使用kafka

一、安装kafka 由于kafka依赖jdk和zookeeper,安装kafka之前需要先安装jdk和zookeeper,也可以使用kafka自带的zookeeper。安装jdk可以参考:Windows和Linux安装jdk,此处使用kafka自带的zookeeper,不单独安装。 下面在Wi…

VUE2/3:element ui table表格的显隐列(若依框架)

若依框架自带一个组件,封装了关于表格,展示和隐藏表格列的功能; 使用效果就是这样的,在表格上面,三个框,从左到右分别是隐藏上面搜索,刷新列表,和显隐列的功能; 一、下面…

每日一题 82. 删除排序链表中的重复元素 II(中等,链表)

和昨天差不多,今天的是把所有重复数字的节点都删除(昨天留了一个) 显然当我们发现重复数字时,需要重复的第一个数字的前一个节点才能把重复数字删完,所有在while循环中我们每次判断 t.next 和 t.next.next 的值是否重复…

互联网今年都崩盘了gis开发还有前途嘛?

互联网和GIS其实分不开的,尤其是在新兴技术领域。 互联网行业都已经在进军测绘、GIS以及智慧城市、无人驾驶等行业,随着高新技术的发展,互联网和GIS其实结合会越来越紧密。 传统互联网行业已经不能满足大众需求,近十年&#xff…

如何应对Android面试官->我用RecyclerView实现了吸顶效果

前言 RecyclerView 计划用两个章节来讲解,今天主要是以 itemDecoration 和 实现吸顶效果为主; ItemDecoration ItemDecoration 允许应用给具体的 View 添加具体的图画或者 Layout 的偏移,对于绘制 View 之间的分割线,视觉分组边…

用bat脚本执行py文件以及批量执行py文件(全网超详细)

1.前言 对于python代码,每次执行一个文件就要运行一个命令,太过麻烦 在Windows电脑上,想一次性执行多个python文件的代码,就需要用到bat脚本 2.python代码 先写几个python代码的文件 如下图 3.py文件为中文,用bat执…

如何使用CFImagehost结合内网穿透搭建私人图床并无公网ip远程访问

[TOC] 推荐一个人工智能学习网站点击跳转 1.前言 图片服务器也称作图床,可以说是互联网存储中最重要的应用之一,不仅网站需要图床提供的外链调取图片,个人或企业也用图床存储各种图片,方便随时访问查看。不过由于图床很不挣钱&a…

腾讯云价格计算器怎么用?太简单了一键报价

腾讯云服务器价格计算器可以一键计算出云服务器的精准报价,包括CVM实例规格价格、CPU内存费用、公网带宽收费、存储系统盘和数据盘详细费用,腾讯云百科txybk.com分享腾讯云价格计算器链接入口、使用方法说明: 腾讯云服务器价格计算器 打开腾…

❤ React报错问题分析

❤ React报错问题分析 ❤️ You passed a second argument to root.render(…) but it only accepts one argument. You passed a second argument to root.render(…) but it only accepts one argument. react-dom.development.js:86 Warning: You passed a second argumen…

css 居中方式

居中分为水平居中和垂直居中

C++ 数组分页,经常有用到分页,索性做一个简单封装 已解决

在项目设计中, 有鼠标滑动需求,但是只能说能力有限,索性使用 php版本的数组分页,解决问题。 经常有用到分页,索性做一个简单封装、 测试用例 QTime curtime QTime::currentTime();nHour curtime.hour();nMin curtim…

各种排序算法学习笔记

Docshttps://r0dhfl3ujy9.feishu.cn/docx/XFlEdnqv9oCEoVx7ok8cpc4knnf?fromfrom_copylink如果你认为有错误,欢迎指出!

Three.js 镜面反射Reflector 为MeshStandardMaterial增加Reflector能力

效果效果官方案例 区别:官方的案例更像一个镜子 没有纹理等属性 也没有透明度修改 根据源码进行修改为 MeshStandardMaterial实现反射 使用案例 createReflector() {const plane this.helper.create.plane(2, 2);this.helper.add(plane.mesh);plane.mesh.rotat…

juniper EX系列交换机POE配置

PoE(Power over Ethernet,以太网供电,又称远程供电)是指设备通过以太网接口,利用双绞线对外接PD(Powered Device,受电设备)设备(如IP 电话、无线AP、网络摄像头等&#x…

什么是视频短信,能用在什么地方?

视频短信是指通过106短信将带有视频的短信内容发送到对应的手机中,也称之为点对点的信息传递方式,视频短信可以支持2兆以内的多媒体信息发送,是直接、直观的宣传、沟通方式。 一、怎么就偏偏要找视频短信 根据目前的行情状况,尽管…

3d模型素材亮度和对比度如何调整呢?

1、修改材质参数:打开3ds Max后,选择要调整亮度和对比度的3D模型素材。然后,进入材质编辑器,选择相应的材质球。在材质编辑器中,你可以调整材质的漫反射、反射和高光等参数,这些参数将影响模型的亮度和对比…