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的用法

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

每日一题——LeetCode1154.一年中的第几天

方法一 列举法: 用一个数组把每个月份的天数都列举出来 判断闰年,是闰年2月份有29天 循环对当前月份之前的月份天数求和 加上当天月份的天数 var dayOfYear function(date) {let year date.slice(0, 4);let month date.slice(5, 7);let day dat…

第十二章Session

第十二章Session 1.什么是Session2.Session的创建与获取3.session域中数据的存取4.Session超时的控制5.浏览器和session之间关联的技术内幕 1.什么是Session 注意:前面的Cookie是保存在客户端,而session是在服务端的 2.Session的创建与获取 这里Session…

2024几个测试接口的好工具,效率加倍~

作为一名后端程序员,一定要对自己写的接口负责,保证接口的正确和稳定性。因此,接口测试也是后端开发中的关键环节。 但我相信,很多朋友是懒得测试接口的,觉得这很麻烦。一般自己写的接口自己都不调用,而是…

RT-Thread入门笔记4-跑马灯线程实例

RT-Thread操作系统是基于线程调度的多任务系统。 线程状态切换 调度过程是一种完全抢占式的基于优先级的调度算法。 支持8/32/256优先级,其中0表示最高,7/31/255表示最低。最低优先级7/31/255优先级用于空闲线程。 支持以相同优先级运行的线程。 共享时…

如何理解线程池中的参数设计

如何理解线程池中的参数设计 你的线程池的参数怎么配置?线程数量设置多少合理?如何确定一个线程池中的人物已经完成了为什么不建议使用java自带的Executors创建线程池线程池里面的阻塞队列设置多少合理? 考察:了解你对技术的掌握…

springboot摄影跟拍预定管理系统源码和论文

首先,论文一开始便是清楚的论述了系统的研究内容。其次,剖析系统需求分析,弄明白“做什么”,分析包括业务分析和业务流程的分析以及用例分析,更进一步明确系统的需求。然后在明白了系统的需求基础上需要进一步地设计系统,主要包罗软件架构模式、整体功能模块、数据库设计。本项…

如何通过 3 个步骤,管理项目可交付成果?

没有可交付成果,就没有项目。无论是构建软件、公寓、汽车还是其他东西,项目工作都可以定义为实现项目可交付成果。 项目管理中的可交付成果 项目可交付成果是项目要实现的最终结果。“可交付成果 "的内容没有限制,可以是实体产品&…

石大版跳一跳(UPC)

题目描述 还记得微信上那个风靡全国的跳一跳小程序吧,估计曾经也受到不少我校同学的喜爱吧。话说唐克也在玩这款游戏,不过,与一般玩家的境界不一样,唐克并不沉迷于游戏,唐克玩游戏是为了开发游戏,作为中国石…

tiktok_浅谈hook ios之发包x-ss-stub

frida-trace ios手机一部,需要越狱的电脑一台idacrackerXI 目标app: ipa 包,点击前往 密码:8urs 协议分析起始从抓包开始,个人习惯 一般安卓逆向可以直接搜关键词,但是ios 都在 Mach-O binary (reverse…

[JAVA数据结构] 认识 Iterable、Collection、List 的常见方法签名以及含义

目录 (一)Iterable 1. 介绍 2. 常见方法 (二)Collection 1. 介绍 2. 常见方法 (三) List 1. 介绍 2. 常见方法 总结 (一) Iterable 1. 介绍 Iterable接口是Java中的一个接口,它是集合框架中的根接口之一。Iterable接口表示实现了迭代功能,即可以通过迭…

JetCache源码解析——缓存处理

在Java技术体系中,如果想要在不改变已有代码逻辑的情况下,对已有的函数进行功能增强,一般可以使用两种方式,如AOP(Aspect Oriented Programming),即面向切面编程,以及代理模式&#…

最详细手把手教你安装 Vivado2019.2

Vivado 是 FPGA 厂商赛灵思公司(Xilinx)于 2012 年起发布的集成设计环境。 Vivado 2019.2 是 2019 年 Xilinx 推出的 Vivado 最后一个版本,相对稳定,并推出了新式的嵌入式开发平台 Vitis。 软件下载 官网可下载各个版本百度网盘…

Android 通知简介

Android 通知简介 1. 基本通知 图1: 基本通知详情 小图标 : 必须提供,通过 setSmallIcon( ) 进行设置.应用名称 : 由系统提供.时间戳 : 由系统提供,也可隐藏时间.大图标(可选) : 可选内容(通常仅用于联系人照片,请勿将其用于应用图标),通过setLargeIcon( ) 进行设置.标题 : 可选…

一日难再晨及时当勉励 date

文章目录 Linux shell 获取更改系统时间默认输入显示时区世界协调时格式化日期更多信息 Linux shell 获取更改系统时间 … note:: 时光只解催人老,不信多情,长恨离亭,泪滴春衫酒易醒。 - 晏殊《采桑子时光只解催人老》date命令可以用来打印…

12.扩展字典(ExtensionDictionary)

愿你出走半生,归来仍是少年! 环境:.NET FrameWork4.5、ObjectArx 2016 64bit、Entity Framework 6. 在10.扩展数据(XData)中我们讲到每个DbObject有一个XData对象可以存储数据,除此之外每个DbObject对象还有一个ExtensionDictionary(扩展字典)可以进行数据存储。…

P1328 [NOIP2014 提高组] 生活大爆炸版石头剪刀布————C++

目录 [NOIP2014 提高组] 生活大爆炸版石头剪刀布题目背景题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 样例 #2样例输入 #2样例输出 #2 提示 解题思路Code调用函数的Code(看起来简洁一点)运行结果 [NOIP2014 提高组] 生活大爆炸版石头剪刀布 …

Tensorflow2.0笔记 - Tensor的数据索引和切片

主要涉及的了基础下标索引"[]",逗号",",冒号":",省略号"..."操作,以及gather,gather_nd和boolean_mask的相关使用方法。 import tensorflow as tf import numpy as nptf.__version__tensor tf.random.uniform([1,5,5,3],…

if单分支,二分支,多分支,语句嵌套,while语句,for语句(Python实现)

一、主要目的: 1.熟悉程序设计结构的三种方式 2.掌握if单分支语句、if二分支语句、if多分支语句及if语句嵌套的使用方法 3.掌握while语句的使用方法 4.掌握for语句的使用方法 5.掌握循环嵌套的使用方法 二、主要内容和结果展现: 1&…

国产ULN2803达林顿驱动芯片为什么可兼容TI ULN2803A的参数特性分享,且可用于红外摄像机等产品中

随着安防视频监控系统工程的需求越来越广,销量也与日俱增。在红外摄像机的红外LED驱动电路应用中,驱动大多数选用达林顿驱动芯片,行业上有用到TI 的ULN2803A,在目前行情,国外芯片紧缺的情况下,不少企业会多…

第一次作业

作业一:安装Euler系统: 和以前安装红帽没多大差别,看以前文章就行 作业二:通过两台Linux主机怕配置ssh实现互相免密登录: 1. 客户端地址:192.168.146.131 服务器地址: 192.168.146.129 1、…