Vue3.0(六):VueX 4.x详解
Vuex4状态管理
什么是状态管理
- 在开发中,我们的应用程序需要处理各种各样的数据,这些数据需要保存在应用程序的某一个位置,对于这些数据的管理,就是 状态管理
- 目前前端项目越来越复杂,多组件共享同一数据的状态很常见,因此需要一个更加方便地状态管理库
Vuex状态管理

- 在Vuex中,组件通过读取Vuex中的State数据状态,显示到页面上
- 而组件想要修改State中的数据,需要通过Dispatch,提交Mutations进行修改,禁止直接对State进行修改
Vuex安装和基本使用
-
在用脚手架搭建的过程中,可以直接进行安装
-
同时,我们也可以手动进行安装
npm install vuex -
在安装完成之后,在 src目录下创建store文件夹,并创建index.js文件
//引入createStore函数
import { createStore } from "vuex";//创建store对象
const store = createStore({//会直接把对象返回出去state: () => ({counter: 100,}),//等同于以下写法// state() {// return { counter: 100 };// },
});export default store;
- 之后再 main.js文件中,引入store即可
import { createApp } from "vue";
import App from "./App.vue";
//引入store对象
import store from "./store";const app = createApp(App);
//使用store对象
app.use(store);
app.mount("#app");
- 在组件 template中使用
<div>{{$store.state.counter}}
</div>
- 在options API中使用
- 通常是在 computed计算属性中进行使用
computed:{counterStore(){return this.$store.state.counter}
}
- 在composition API中使用
- 需要引入 useStore函数进行使用
- 若直接定义变量进行赋值,则不会是响应式
const counter = store.state.counter - 需要进行响应式的处理
import { computed, toRef } from "vue";
import { useStore } from "vuex";
const store = useStore();
//可以用计算属性返回
const counter = computed(() => {return store.state.counter;
});
//可以通过toRef转成响应式
const counterRef = toRef(store.state.counter);
与单纯的全局对象有什么区别
- Vuex的状态存储是响应式的
- 不能直接改变store中的状态(代码上可以直接更改,但是规范上不可以)
单一状态树
- Vuex使用的是单一状态树
- 用一个对象就包含了全部应用层级的状态
- 即一个项目中,只会创建一个store进行状态管理
- 若多个组件有不同的状态进行管理
- 可以进行module进行模块化,管理多个组件的状态
- 优势
- 单一状态树能够让我们 最直接的方式找到某个状态的片段
- 方便维护和调试
- 但是相对于pinia不够灵活
Vuex-Store的State映射到组件中
目的是取状态更为方便一点,就像在组件内部定义变量一样使用
options API–mapState
- 在options API中我们可以使用 mapState函数进行映射
- 传入参数
- 数组:需要是state中存在的属性
- 对象:用于 state中的属性与组件本身的变量命名冲突
- 返回值
- 返回的就是一个函数,可以直接用于computed中
//比如现在store中存在以下属性
//name: "zhangcheng",
//age: "18",
//address: "hebei",import { mapState } from "vuex";
computed: {//传入数组参数...mapState(["name", "age", "address"]),//等同于以下写法// name() {// return this.$store.state.name// }//传入对象参数...mapState({sName: (state) => state.name,}),
},
composition API中将state映射到组件
前面我们知道在vuex中有一个mapState函数,可以帮助我们完成映射
- mapState返回的函数,内部实际上用到了
this.$store.state- 我们知道,composition中,无法使用this,且this中没有$store
- 而在前面,我们知道composition API中需要用到 useState函数
import { useStore } from "vuex";
const store = useStore();
//通过store.state.name获取
- 如果想将 useState函数和mapState函数结合使用
- 将 mapState返回值,传入到computed计算属性中(computed内部接收一个函数)
- 同时改变 参数的this指向
//获取计算属性
import { computed } from "vue";
//获取mapState与useStore函数
import { mapState, useStore } from "vuex";//获取返回值,此时的name是一个函数
const { name } = mapState(["name"]);const store = useStore();
//在传入name的时候,通过bind改变this指向
//因为computed需要传入一个函数,而call和apply返回值都是函数本身的返回值
//而bind返回的是一个函数
const cName = computed(name.bind({ $store: store }));
- 以上方法比较繁琐,我们可以通过以下方式进行
- 通过解构的方法,用toRefs包裹即可
import { toRefs } from "vue";
import { useStore } from "vuex";const store = useStore();
//解构的时候对变量重命名
//注意使用toRefs
const { name: cName, age } = toRefs(store.state);
getter的基本使用
类似于computed计算属性,对state中的数据可以进行复杂逻辑的处理
- 在定义store对象的时候,可以配置getters选项
- 第一个参数state,接收的就是state中的变量
- 第二个参数getters,接收的就是getter中的变量
- 返回值可以返回一个函数,这样就可以让外界传值进来
//引入createStore函数
import { createStore } from "vuex";//创建store对象
const store = createStore({//会直接把对象返回出去state: () => ({name: "zhangcheng",age: "18",address: "hebei",}),getters: {//第一个参数用于接收state中的变量nameAge(state) {return state.name + state.age; //"zhangcheng18"},//第二个参数,用于接收getters中的变量info(state, getters) {return getters.nameAge + state.address; //"zhangcheng18hebei"},//可以返回一个函数,用于接收变量returnInfo(state) {return function (name) {return `${name} is ${state.name} friend`;};},},
});
- 实际调用
<div>nameAge{{ $store.getters.nameAge }}</div>
<div>info{{ $store.getters.info }}</div>
<div>returnInfo{{ $store.getters.returnInfo("lisi") }}</div>
nameAgezhangcheng18
infozhangcheng18hebei
returnInfolisi is zhangcheng friend
- 对于 getters中的变量,也有相应的映射函数,mapGetters的用法同mapState的用法一样
Mutation基本使用
是Vuex中修改State的唯一途径
在mutation中写的都是同步代码,不能写异步代码,比如进行网络请求
- 首先在创建 创建 store对象时候,配置mutation选项
- 第一个参数 state用于访问state中的状态
- 第二个参数 payload用于接收传入的参数
//创建store对象
const store = createStore({//会直接把对象返回出去state: () => ({name: "zhangcheng",age: "18",address: "hebei",}),mutations: {changeName(state,payload) {state.name = payload;},},
});
在options API中的使用
- 仅需在对应的methods中,使用commit访问即可
- commit中的第一个参数,要与mutation中准备调用方法的名字保持一致
methods:{change(){this.$store.commit("changeName","lisi")}
}

在compositions API中的使用
- 在setup中,引入useStore函数
- 调用commit方法即可
import {useStore} from "vuex"const store = useStore()
const changeInfo = store.commit("changeInfo")
actions的基本使用
-
Action类似于mutation,但是不同的地方在于
- Action提交的是mutation,而不是直接变更状态
- 在action中,并不是对State进行修改,而是通过mutation进行修改
- Action可以包含任何异步操作
- Action提交的是mutation,而不是直接变更状态
-
在创建store实例的时候
mutations: {changeName(state, payload) {state.name = payload;},},actions: {changeNameAction(context, payload) {//第一个参数相当于store实例,但实际上不是//第二个参数是通过dispatch调用方法,传入的参数context.commit("changeName", payload);},},
- 调用
- 通过 dispatch函数进行调用
change() {this.$store.dispatch("changeNameAction", "lisi");
},
实际用法
- actions中通常是进行网络请求的
- 而mutations中是修改state的唯一途径
- 下面是一个实际案例的做法
- 我们通过Vuex进行状态管理
- 在actions中,请求数据,通过commit提交mutation
- 在mutation中修改state
//创建store对象
const store = createStore({//会直接把对象返回出去state: () => ({list: [],}),mutations: {//修改statechangeName(state, payload) {state.list = payload;},},actions: {//进行网络请求,并且提交commit申请changeNameAction(context, payload) {fetch(xxxxx).then((res) => {return res.json();}).then((res) => {context.commit("changeName", res);});},},
});
- 若在组件中,通过 dispatch函数调用了actions中的方法,也想拿到返回值
- 那么这个方法需要返回一个promise
actions:{changeName(){return new Promise((resolve)=>{resolve(123)})}
}//实际调用的时候
this.$store.dispatch("changeName").then((res)=>{console.log(res)
})
module的基本使用
-
在使用Vuex进行状态管理的时候,难免维护的状态会十分庞大
-
因此我们可以使用 modules将store分割成模块
-
每个模块都拥有自己的state、mutation、action、getter,甚至可以嵌套子模块
-
创建一个模块
export default{state:()=>({}),getters:{},mutations:{},actions:{}
}
- 在 创建 store对象的时候,引入模块
import homeModule from "../home.js"
import { createStore } from "vuex";const store = createStore({modules:{//引入模块的名字:实际引入的模块home:homeModule}
})//在实际使用中,mutation以及action、getters 可以直接读取
//而读取state中的数据有所变化
store.state.home.name
module的局部状态
上面我们知道可以进行分模块的操作
-
那么我们想在模块中,访问根模块的内容需要怎么访问
-
比如在 home模块中
getters:{changeCounter(state,getters,rootState){//state是本模块中的状态//getters是本模块中的getters//rootState是根模块的state}
}
//同理mutation和actions
- 且 actions、mutations和getters中的命名不能与根组件中重复
相关文章:
Vue3.0(六):VueX 4.x详解
Vuex4状态管理 什么是状态管理 在开发中,我们的应用程序需要处理各种各样的数据,这些数据需要保存在应用程序的某一个位置,对于这些数据的管理,就是 状态管理目前前端项目越来越复杂,多组件共享同一数据的状态很常见…...
突破编程_C++_面试(基础知识(13))
面试题45:C中的字符串如何存储 在C中,字符串可以通过多种方式存储,但最常见和推荐使用的方式是通过 std::string 类,该类位于 <string> 头文件中。std::string 是一个类模板的实例,通常用于存储字符数组&#x…...
掌握C语言文件操作:从入门到精通的完整指南!
✨✨ 欢迎大家来到贝蒂大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:C语言学习 贝蒂的主页:Betty‘s blog 1. 什么是文件 文件其实是指一组相关数据的有序集合。这个数据集有一个名称&a…...
JavaEE作业-实验二
目录 1 实验内容 2 实验要求 3 思路 4 核心代码 5 实验结果 1 实验内容 实现两个整数求和的WEB程序 2 实验要求 ①采用SpringMVC框架实现 ②数据传送到WEB界面采用JSON方式 3 思路 ①创建一个SpringMVC项目,配置好相关的依赖和配置文件。 ②创建一个Con…...
2月8号作业
Sqlite3系统命令 .quit 退出数据库 .exit 退出数据库 .help 显示帮助信息,获取所有系统命令 .table 查看当前数据库下的所有表格 .schema 查看表的结构 Sqlite3语句 创建表格: create table 表名 (字段名 数据类型, 字段名 数据类型); create table if…...
08:K8S资源对象管理|服务与负载均衡|Ingress
K8S资源对象管理|服务与负载均衡|Ingress DaemonSet控制器污点策略容忍容忍污点 其他资源对象Job资源对象 有限生命周期CronJob资源对象 集群服务服务自动发现headless服务 实现服务定位与查找 服务类型 Ingress插件 发布服务的方式 DaemonSet控制器 Da…...
HarmonyOS 横屏调试与真机横屏运行
我们有些程序 需要横屏才能执行出效果 我们在预览器上 点击如下图指向出 就进入一个横屏调试了 但 我们真机运行 依旧是竖着的 我们如下图 找到 module.json5 在 abilities 下面 第一个对象 最下面 加上 "orientation": "landscape"然后 我们再真机运…...
Javaweb基础-tomcat,servlet
一.配置文件基础: properties配置文件: 由键值对组成 键和值之间的符号是等号 每一行都必须顶格写,前面不能有空格之类的其他符号 xml配置文件:(xml语法HTML语法HTML约束)xml约束-DTD / Schema DOM4…...
HCIA-HarmonyOS设备开发认证V2.0-3.2.轻量系统内核基础-中断管理
目录 一、中断基础概念二、中断管理使用说明三、中断管理模块接口四、代码分析(待续...)坚持就有收获 一、中断基础概念 在程序运行过程中,出现需要由 CPU 立即处理的事务时,CPU 暂时中止当前程序的执行转而处理这个事务…...
【开源】JAVA+Vue+SpringBoot实现就医保险管理系统
目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 科室档案模块2.2 医生档案模块2.3 预约挂号模块2.4 我的挂号模块 三、系统展示四、核心代码4.1 用户查询全部医生4.2 新增医生4.3 查询科室4.4 新增号源4.5 预约号源 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVue…...
Stable Diffusion 模型下载:DreamShaper XL(梦想塑造者 XL)
本文收录于《AI绘画从入门到精通》专栏,专栏总目录:点这里。 文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八案例九案例十 下载地址 模型介绍 DreamShaper 是一个分格多样的大模型,可以生成写实、原画、2.5D 等…...
【机器学习】数据清洗之处理异常点
🎈个人主页:甜美的江 🎉欢迎 👍点赞✍评论⭐收藏 🤗收录专栏:机器学习 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进步…...
JavaScript学习之旅10------掌握jQuery:实用应用案例深度解析
目录 写在开头1. jQuery基础知识回顾1.1. 选择器1.2. 事件1.3. 效果1.4. DOM操作1.5. AJAX 2. 实用应用案例分析2.1. 动态内容加载2.2. 表单验证2.3. 图像滑动门效果2.4. 创建动态导航菜单 3. 高级技巧与最佳实践3.1. 优化jQuery代码的性能3.2. jQuery插件的使用和自定义3.3. j…...
017_逆向工程搭建和使用
文章目录 启动代码生成器然后访问第一步处理:前端代码删除逆向生成的代码中有好多东西要引入创建gulimall-common插曲:修改模块名dao层entity层service层controllerRQuery文件当中的报错☆ 调整renren-generator的逆向工程逆向生成代码当中有什么总结...
位运算+leetcode(1)
基础 1.基础知识 以下都是针对数字的二进制进行操作 >> 右移操作符<< 左移操作符~ 取反操作符 & 有0就是0,全一才一 | 有一才一 ,全0才0^ 相同为0,相异为1 异或( ^ )运算的规律 a ^ 0 a a ^ a 0a ^ b ^ c a ^ (b …...
如何在 JavaScript 中比较两个日期 – 技术、方法和最佳实践
在 JavaScript 中,您可以使用 date 对象有效地处理应用程序中的日期、时间和时区。 Date 对象可帮助您有效地操作数据、处理各种与日期相关的任务,并在创建实际应用程序时执行一些计算。 (本文内容参考:java567.com)…...
【More Effective C++】条款17:考虑使用lazy evaluation
含义:将计算拖延到必须计算的时候,以下为4个场景 优点:避免不必要的计算,节省成本 缺点: 管理复杂性:可能会增加代码复杂性,特别是在多线程环境中需要正确处理同步和并发问题。性能开销&…...
深入探索Pandas读写XML文件的完整指南与实战read_xml、to_xml【第79篇—读写XML文件】
深入探索Pandas读写XML文件的完整指南与实战read_xml、to_xml XML(eXtensible Markup Language)是一种常见的数据交换格式,广泛应用于各种应用程序和领域。在数据处理中,Pandas是一个强大的工具,它提供了read_xml和to…...
如何在我们的模型中使用Beam search
在上一篇文章中我们具体探讨了Beam search的思想以及Beam search的大致工作流程。根据对Beam search的大致流程我们已经清楚了,在这我们来具体实现一下Beam search并应用在我们的seq2seq任务中。 1. python中的堆(heapq) 堆是一种特殊的树形…...
PKI - 借助Nginx 实现Https 服务端单向认证、服务端客户端双向认证
文章目录 Openssl操系统默认的CA证书的公钥位置Nginx Https 自签证书1. 生成自签名证书和私钥2. 配置 Nginx 使用 HTTPS3. 重启 Nginx 服务4. 直接访问5. 不验证证书直接访问6. 使用server.crt作为ca证书验证服务端解决方法1:使用 --resolve 参数进行请求域名解析解…...
Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...
智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...
练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...
UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...
Linux简单的操作
ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...
大语言模型如何处理长文本?常用文本分割技术详解
为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...
ios苹果系统,js 滑动屏幕、锚定无效
现象:window.addEventListener监听touch无效,划不动屏幕,但是代码逻辑都有执行到。 scrollIntoView也无效。 原因:这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作,从而会影响…...
并发编程 - go版
1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...
论文阅读笔记——Muffin: Testing Deep Learning Libraries via Neural Architecture Fuzzing
Muffin 论文 现有方法 CRADLE 和 LEMON,依赖模型推理阶段输出进行差分测试,但在训练阶段是不可行的,因为训练阶段直到最后才有固定输出,中间过程是不断变化的。API 库覆盖低,因为各个 API 都是在各种具体场景下使用。…...
