【Vue.js】全局状态管理模式插件vuex
文章目录
- 全局状态管理模式Vuex
- vuex是什么?
- 什么是“状态管理模式”?
- vuex的应用场景
- Vuex安装
- 开始
- 核心概念
- 一、State
- 1、单一状态树
- 2、在 Vue 组件中获得 Vuex 状态
- 3、mapState辅助函数
- 二、Getter
- 三、Mutation
- 1、提交载荷(Payload)
- 2、对象风格的提交方式
- 3、使用常量代替Mutation事件类型
- 4、Mutation必须是同步函数
- 5、在组件中提交Mutation
- 四、Action
全局状态管理模式Vuex
💡 Tips:由于需要使用到全局变量,vue3做全局状态管理和它搭配最好的是Pinia,但是菠萝是和组合式API搭配一起使用更好一些。和Pinia功能一模一样的是Vuex插件,这个插件公司相对使用得较多。
- vue3对应的是vuex4版本,vue2对应的是vuex3版本
- vue3的官网是找不到vuex,在vue2的官网https://vuex.vuejs.org/zh/
vuex是什么?
Vuex是专门为Vue设计的状态管理模式+库。我们通常称之为全局状态管理模式,它能管理所有组件的状态。(状态在vue里面可以理解为响应式数据)
什么是“状态管理模式”?
状态管理自管理应用包含三部分:
- 状态,驱动应用的数据源
- 视图,以声明方式将状态映射到视图
- 操作,响应式的在视图上的用户输入导致的状态变化
当我们的应用遇到多个组件共享状态(数据)时,单项数据流的简洁性很容易被破坏。意思是说vue是单项数据流,数据只能从父的去改变子的,子的是不能操作父的。
vuex的应用场景
- 多个视图(组件)依赖于同一个状态(数据)
- 来自不同视图(组件)的行为需要变更同一状态(数据),指的是多个组件需要更改同一个数据
问题一:传参的方法对于多层嵌套的组件将会非常繁琐,并且对于兄弟组件间的状态传递无能为力。
问题二:我们经常会采用父子组件直接引用或者通过事件来变更和同步状态的多份拷贝。以上的这些模式非常脆弱,通常会导致无法维护的代码。
因此,我们把组件的共享状态抽取出来,以一个全局单例模式管理
Vuex安装
- 项目安装命令npm init vue@latest
- 依赖安装npm i
- Vuex安装npm install vuex@next --save
开始
可以创建一个store文件夹存放index.js文件
// 从vuex里面解构createStore方法
import { createStore } from "vuex";
// 创建仓库实例
const store = createStore()
// 暴露实例
export default store;
从入口文件main.js引入仓库实例
这里注意:如果路径默认以文件夹结尾,例如这里的./store相当于./store/index.js
import { createApp } from "vue";
import App from "./App.vue";// 引入仓库实例
import store from "./store";createApp(App).use(store).mount("#app");
仓库的state就是全局的数据,相当于组件的data,语法是data一样是函数返回对象
// 要创建仓库实例
import { createStore } from "vuex";const store = createStore({// 仓库的state就是全局的数据,相当于组件的datastate() {return {count: 10,};},
});export default store;
在跟组件里面引入两个子组件
<template><h2>vuex-demo</h2><Child1 /><hr /><Child2 />
</template><script>
import Child1 from "./components/Child1.vue";
import Child2 from "./components/Child2.vue";export default {components: {Child1,Child2,},
};
</script>
通过this.store在子组件中拿到仓库的数据,这里的this.store在子组件中拿到仓库的数据,这里的this.store在子组件中拿到仓库的数据,这里的this.store是仓库实例是个对象类似于this.$route
- 可以通过this.$store.state.xxx来获取仓库数据
- 计算属性会根据已有的值去计算一个新的结果,并且已有的值可以作为计算属性的依赖
export default {mounted() {return this.$store.state.count;},computed: {count() {return this.$store.state.count;},},
}
- 仓库数据不能使用data来接收,会导致响应式失效
// 仓库数据不能使用data来接受,会导致响应式失效data() {return {count: this.$store.state.count,};},
- 直接修改是不符合规范的
methods: {fn() {// 直接修改是不符合规范this.$store.state.count++;},},
- mutations是唯一可以改变state的地方,里面放函数,子组件可以通过commit方法去调用这个函数改变仓库数据
mutations: {increment(state) {state.count++;},}
methods: {fn() {this.$store.commit("increment");},}
核心概念
一、State
1、单一状态树
- 一个项目里面只有一个仓库,只有一个state。
- 单一状态树和模块化并不冲突,项目会分模块,意味着会有多个state
2、在 Vue 组件中获得 Vuex 状态
- 由于 Vuex 的状态存储是响应式的,从 store 实例中读取状态最简单的方法就是在计算属性中返回某个状态
3、mapState辅助函数
💡Tips:当一个组件需要获取多个状态的时候,将这些状态都声明为计算属性会有些重复和冗余。可以使用 mapState 辅助函数帮助我们生成计算属性,较少代码量
- mapState数组写法
- 当映射的计算属性的名称与 state 的子节点名称相同时,我们也可以给 mapState 传一个字符串数组。
// 重复和冗余
// computed: {// count() {// return this.$store.state.count;// },// name() {// return this.$store.state.name;// },// sex() {// return this.$store.state.sex;// },// likes() {// return this.$store.state.likes;// },// },// mapState的数组写法computed: mapState(["count", "name", "sex", "likes"]),
- mapState对象写法
- 可以重命名
- 可以写函数,改造数据
computed: mapState({// 重命名num: "count",// 函数写法用于做数据的改造name: (state) => "亲爱的" + state.name,sex: (state) => {return state.sex === 1 ? "男" : "女";},// 如果需要用到this,要把箭头函数转成普通函数likes(state) {return state.likes.concat(this.like);},}),
由于组件自身就可以写computed属性,但是组件里面的选项是不能重复的,如果我们写两个computed那么后面的对象肯定会覆盖前面的。
解决方法:使用扩展运算符或者Object.assign() 浅拷贝合并对象
computed: {...mapState({// 重命名num: "count",// 函数写法用于做数据的改造name: (state) => "亲爱的" + state.name,sex: (state) => {return state.sex === 1 ? "男" : "女";},// 如果需要用到this,要把箭头函数转成普通函数likes(state) {return state.likes.concat(this.like);},}),doubleNum() {return this.num2 * 2;},},
二、Getter
场景:如果我们的各自组件都需要封装一个相同的函数,例如计算属性里面封装一个时间戳函数,我们需要在其他组件中复用这个函数,这样重复的代码就很多,这是我们希望将函数写在仓库里给其他组件使用。
- getters相当于仓库的计算属性
- state这个参数就是为了拿到state(){}里面的数据
- getters这个参数表示一个getters不仅可以依赖仓库的数据,还可以依赖另一个getters。(一般用不上)
- getters传参
- mapGetters 辅助函数,mapGetters仅仅是将 store 中的 getter 映射到局部计算属性
// getters相当于是仓库的计算属性getters: {timeStr(state, getters) {const date = new Date(state.time);const Y = date.getFullYear() + "-";const M =(date.getMonth() + 1 < 10? "0" + (date.getMonth() + 1): date.getMonth() + 1) + "-";const D =(date.getDate() < 10 ? "0" + date.getDate() : date.getDate()) + " ";const h =(date.getHours() < 10 ? "0" + date.getHours() : date.getHours()) + ":";const m =(date.getMinutes() < 10 ? "0" + date.getMinutes() : date.getMinutes()) +":";const s =date.getSeconds() < 10 ? "0" + date.getSeconds() : date.getSeconds();return Y + M + D + h + m + s;},timeStr2(state, getters) {return getters.timeStr + "!!!";},count2: (state) => (n) => state.count * n,
});
三、Mutation
mutation是唯一可以改变state的方法。mutation里面是放函数,通过this.store.commit方法去触发mutation里面的函数。
1、提交载荷(Payload)
- 可以接受第二个参数payload(载荷),表示参数
- 一般情况下payload建议写成对象的形式
- 对象可以传多个值
- 方便维护
syncAgeAdd(state, payload) {state.age += payload.n;},
2、对象风格的提交方式
add(n) {// 如何去触发仓库的mutations的函数this.$store.commit("increment2", { num: n });// 等价于下面的对象风格的提交方式this.$store.commit({// type: "increment2",type: INCREMENT2,num: n,});},
3、使用常量代替Mutation事件类型
使用常量将字符串存起来使用
export const INCREMENT2 = "increment2";
4、Mutation必须是同步函数
- 每一次调用mutation的函数的时候,在开发工具里面都会产生一条记录(就是快照)
- 产生快照的时间是mutation函数调用的时间,而不是数据改变的时间。
- 会让开发工具里面快照的值有错误(例如下面使用定时器异步代码)
addage(state) {setTimeout(() => {state.age++;}, 2000);
},
5、在组件中提交Mutation
- mapMutations辅助函数是使用在methods里面
- 下面代码将仓库的addage函数映射到了组件的methods里面,变成了methods里面有addage函数
methods: {
ageadd() {// this.$store.commit("addage");this.addage();},// 将仓库的addage函数映射到了组件的methods里面,// 变成了methods里面有addage函数...mapMutations(["addage", INCREMENT2]),}
四、Action
action类似于mutation,不同的在于:
- Action 提交的是 mutation,而不是直接变更状态。
- Action 可以包含任意异步操作。
- 通过dispatch的方法来调用仓库的actions的函数
- actions是不能直接修改state的,只能通过调用mutations的函数
<template><h3>actions</h3><div>age: {{ age }} - <button @click="fn">async age++</button></div>
</template><script>
import { mapState, mapActions } from "vuex";export default {computed: mapState(["age"]),methods: {fn() {// 通过dispatch的方法来调用仓库的actions的函数// this.$store.dispatch("asyncAgeAdd", { n: 4 });this.asyncAgeAdd({ n: 4 });},...mapActions(["asyncAgeAdd"]),},
};
</script>
相关文章:
【Vue.js】全局状态管理模式插件vuex
文章目录全局状态管理模式Vuexvuex是什么?什么是“状态管理模式”?vuex的应用场景Vuex安装开始核心概念一、State1、单一状态树2、在 Vue 组件中获得 Vuex 状态3、mapState辅助函数二、Getter三、Mutation1、提交载荷(Payload)2、…...
JPA 之 Hibernate EntityManager 使用指南
Hibernate EntityManager 专题 参考: JPA – EntityManager常用API详解EntityManager基本概念 基本概念及获得 EntityManager 对象 基本概念 在使用持久化工具的时候,一般都有一个对象来操作数据库,在原生的Hibernate中叫做Session&…...
英语作文提示(持续更新)
星期(介词on)Monday星期一Tuesday星期二Wednesday星期三Thursday星期四Friday星期五Saturday星期六Sunday星期日月份(介词in)lunar calendar农历on the second day of the second lunar农历初二January1月February2月March3月Apri…...
【计算机组成原理】计算机的性能指标、数据的表示和运算、BCD码和余3码
计算机组成原理(二) 计算机的性能指标: 存储器的性能指标: 存储器中,MAR为存储单元的个数 MDR为机械字长也就是存储单元的长度 存储器的大小MAR*MDR n为二进制位能表示出几种不同的状态呢? 2的n次方种不同的状态 CPU的性能指标…...
三天吃透MySQL八股文(2023最新整理)
本文已经收录到Github仓库,该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招分享等核心知识点,欢迎star~ Github地址:https://github.com/…...
队列_23约瑟夫问题+_24猫狗收容所
约瑟夫问题 n 个小孩围坐成一圈,并按顺时针编号为1,2,…,n,从编号为 p 的小孩顺时针依次报数,由1报到m ,当报到 m 时,该小孩从圈中出去,然后下一个再从1报数,当报到 m 时再出去。如此反复&#…...
gradle
Gradle环境介绍OpenJDK 17.0.5Gradle 7.6示例代码 fly-gradleGradle 项目下文件介绍如果你的电脑安装了 gradle,可以使用 gradle init 去初始化一个新的 gradle 工程,然后使用电脑安装的 gradle 去执行构建命令。但是每个开发电脑上的 gradle 版本不一样…...
[牛客]链表中倒数第k个结点
使用快慢指针法:两种思路:1.fast先向后走k-1次,slow再向后走1次,然后fast和slow同时向后走,当fast走到最后一个结点时,slow刚好在倒数第k个位置上;2.fast先向后走k次,slow再向后走1次,然后fast和slow同时向后走,当fast走到最后一个结点的后面时(此时为NULL),slow刚好在倒数第k个…...
English Learning - L2 语音作业打卡 双元音 [eɪ] [aɪ] Day14 2023.3.6 周一
English Learning - L2 语音作业打卡 双元音 [eɪ] [aɪ] Day14 2023.3.6 周一💌发音小贴士:💌当日目标音发音规则/技巧:🍭 Part 1【热身练习】🍭 Part2【练习内容】🍭【练习感受】🍓元音 /eɪ/…...
C++ this 指针与静态成员
文章目录参考描述实例成员与静态成员实例成员静态成员静态成员属性隐式形参 this 指针冲突this 指针静态成员函数this 指针与静态成员函数参考 项目精通C (第九版)托尼加迪斯、朱迪沃尔特斯、戈德弗雷穆甘达 (著) / 黄刚 等 &…...
REDIS16_LRU算法概述、查看默认内存、默认是如何删除数据、缓存淘汰策略
文章目录①. LRU算法概述②. 查看默认内存③. 如何删除数据④. 缓存淘汰策略①. LRU算法概述 ①. LRU是Least Recently Used的缩写,即最近最少使用,是一种常用的页面置换算法,选择最近最久未使用的数据给予淘汰 (leetcode-cn.com/problems/lru-cache) ②. LRU算法题来源 ③.…...
ClassMix: Segmentation-Based Data Augmentation for Semi-Supervised Learning学习笔记
ClassMix相关介绍主要思想方法Mean-Teacher损失函数交叉熵损失标签污染实验实验反思参考资料相关介绍 从DAFormer溯源到这篇文章,ClassMix主要是集合了伪标签和一致性正则化,思想来源于CutMix那条研究路线,但是优化了CutMix中的标签污染的情…...
CSDN竞赛第35期题解
CSDN竞赛第35期题解 1、题目名称:交换后的or 给定两组长度为n的二进制串,请问有多少种方法在第一个串中交换两个不同位置上的数字,使得这两个二进制串“或”的 结果发生改变? int n;cin>>n; string a,b;cin>>a>…...
Java应用服务系统安全性,签名和验签浅析
1 前言 随着互联网的普及,分布式服务部署越来越流行,服务之间通信的安全性也是越来越值得关注。这里,笔者把应用与服务之间通信时,进行的的安全性相关,加签与验签,进行了一个简单的记录。 2 安全性痛点 …...
spring中bean的实例化
构造方法实现实例化 无参构造器实例化 我们之前用的就一直是无参构造器实现实例化,虽然没有在类中写构造器,但是每个类都会有一个默认的无参构造器 有参构造器实例化 相比于无参构造器,我们只需要传入参数就可以了 我们可以通过construc…...
磨皮插件portraiture2023最新中文版
Portraiture滤镜是一款 Photoshop,Lightroom 和 Aperture 插件,DobeLighttroom 的 Portraiture 消除了选择性掩蔽和逐像素处理的繁琐的手工劳动,以帮助您在肖像修整方面取得卓越的效果。它是一个强大的,但用户友好的插件照明.这是…...
记录每日LeetCode 2269.找到一个数组的K美丽值 Java实现
题目描述: 一个整数 num 的 k 美丽值定义为 num 中符合以下条件的 子字符串 数目: 子字符串长度为 k 。 子字符串能整除 num 。 给你整数 num 和 k ,请你返回 num 的 k 美丽值。 注意: 允许有 前缀 0 。 0 不能整除任何…...
代码管理--svnadmin工具介绍
1、简介 SVNAdmin2 是一款通过图形界面管理服务端SVN的web程序。正常情况下配置SVN仓库的人员权限需要登录到服务器手动修改 authz 和 passwd 两个文件,当仓库结构和人员权限上了规模后,手动管理就变的非常容易出错,本系统能够识别人员和权限…...
Git的基本使用以及上传到GitHub
GIT的基本使用一、安装并配置GIT二、Git的基本操作三、使用GIT上传至GitHub四、Git分支一、安装并配置GIT 1.安装GIT连接 GIT安装包链接 2.打开GIT 鼠标右键点击Git Bash Here 安装完 Git 之后,第一件事就是设置自己的用户名和邮件地址。因为通过 Git 对项目进行…...
国科大论文latex模板中可能的注意事项
背景 国科大2022年9月发布了毕业论文的LaTeX模板,它是在ucasthesis上修改而来的,但近日使用国科大发布版本时发现有几点不同以及需要注意的地方。本人只会简单使用latex,但并不熟悉latex样式编辑,因此以下介绍与方法仅供参考。仅…...
Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...
Appium+python自动化(十六)- ADB命令
简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...
.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...
大数据零基础学习day1之环境准备和大数据初步理解
学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...
【Go】3、Go语言进阶与依赖管理
前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes࿰…...
LLM基础1_语言模型如何处理文本
基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...
【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...
分布式增量爬虫实现方案
之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面,避免重复抓取,以节省资源和时间。 在分布式环境下,增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路:将增量判…...
视觉slam十四讲实践部分记录——ch2、ch3
ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...
Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战
说明:这是一个机器学习实战项目(附带数据代码文档),如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下,风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...
