Vue3.0(六):VueX 4.x详解

Vuex4状态管理

什么是状态管理

  • 在开发中,我们的应用程序需要处理各种各样的数据,这些数据需要保存在应用程序的某一个位置,对于这些数据的管理,就是 状态管理
  • 目前前端项目越来越复杂,多组件共享同一数据的状态很常见,因此需要一个更加方便地状态管理库

Vuex状态管理

image.png

  • 在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")}
}

image.png

在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可以包含任何异步操作
  • 在创建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中的命名不能与根组件中重复

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

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

相关文章

【排序】归并排序

归并排序 动图演示&#xff1a; 基本思想&#xff1a;分治思想 归并排序&#xff08;MERGE-SORT&#xff09;是建立在归并操作上的一种有效的排序算法,该算法是采用分治法的一个非常典型的应用。将已有序的子序列合并&#xff0c;得到完全有序的序列&#xff1b;即先使每个子…

小白学Halcon100例:如何应用极坐标的展开及逆变换?

这里写目录标题 什么是极坐标系?在halcon中对应的算子halcon实例程序输出结果:原图什么是极坐标系? 1、极坐标系(polar coordinates)是指在平面内由极点、极轴和极径组成的坐标系。在平面上取定一点O,称为极点。从O出发引一条射线Ox,称为极轴。再取定一个单位长度,通常…

“操作符大揭秘:一篇文章让你秒懂所有!”

目录 1. ⼆进制介绍 2. 原码、反码、补码 3. 移位操作符 4. 位操作符&#xff1a;&、|、^ 5. 逗号表达式 6. 下标访问[]、函数调⽤() 7. 操作符的属性&#xff1a;优先级、结合性 8. 整型提升 9. 算术转换 10. 表达式求值 正文开始&#xff1a; 1. ⼆进制 其实我…

Mysql的安装、使用、优势与教程

一.安装 1.在小皮的设置界面检测3306端口&#xff0c;保障3306端口可用&#xff1b; 2、在小皮的首面界面&#xff0c;启动MySQL&#xff1b; 3、进行环境变量设置&#xff0c;找到MySQL的路径&#xff0c;进行复制&#xff1b; 4、在Windows的搜索栏内&#xff0c;输入“环境…

区块链互操作协议

1. 引言 Alexei Zamyatin等人2019年论文 SoK: Communication Across Distributed Ledgers。 参考资料 [1] 2019年论文 SoK: Communication Across Distributed Ledgers [2] A list of blockchain-related SoK papers [3] 2021年视频 FC21: SoK: Communica…

【机器学习】数据清洗之处理异常点

&#x1f388;个人主页&#xff1a;甜美的江 &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;机器学习 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进步…

数据结构——lesson2线性表和顺序表

目录 前言 一、顺序表是什么&#xff1f; 1. 静态顺序表&#xff1a;使用定长数组存储元素 2. 动态顺序表&#xff1a;使用动态开辟的数组存储。 二、接口实现 1.动态顺序表存储 2.基本增删查改接口 (1)初始化顺序表 (2)顺序表摧毁 (3)检查空间 (4)顺序表打印 (5)顺…

第四篇【传奇开心果微博系列】Python微项目技术点案例示例:美女颜值判官

传奇开心果微博系列 系列微博目录Python微项目技术点案例示例系列 微博目录一、微项目目标二、雏形示例代码三、扩展思路四、添加不同类型的美女示例代码五、增加难度等级示例代码六、添加特殊道具示例代码七、设计关卡系统示例代码八、添加音效和背景音乐示例代码九、多人游戏…

C++ 音视频原理

本篇文章我们来描述一下音视频原理 音视频录制原理: 下面是对这张思维导图的介绍 摄像头部分: 麦克风采集声音 摄像头采集画面 摄像头采集回来的数据可以用RGB也可以用YUV来表示 图像帧帧率 一秒能处理多少张图像 图像处理 &#xff1a;调亮度 图像帧队列 :意思是将数据取…

简单介绍源程序执行方式

源程序执行方式 编译和解释 程序设计语言能够把算法翻译成机器能够理解的可执行程序。这里将计算机不能直接执行的非机器语言源程序翻译成能直接执行的机器语言的语言翻译程序称为语言处理程序 源程序&#xff1a;用各种程序设计语言编写的程序称为源程序&#xff0c;计算机不…

C++ //练习 6.6 说明形参、局部变量以及局部静态变量的区别。编写一个函数,同时用到这三种形式。

C Primer&#xff08;第5版&#xff09; 练习 6.6 练习 6.6 说明形参、局部变量以及局部静态变量的区别。编写一个函数&#xff0c;同时用到这三种形式。 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&#xff1a;vim 代码块 /********************…

分享87个CSS3特效,总有一款适合您

分享87个CSS3特效&#xff0c;总有一款适合您 87个CSS3特效下载链接&#xff1a;https://pan.baidu.com/s/1CAxe8nPBzXvH7Nr6B_U72Q?pwd8888 提取码&#xff1a;8888 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;收集整理更不…

更新至2022年,迪博上市公司内部控制指数、分项指数、评级等数据

更新至2022年&#xff0c;上市公司迪博内部控制指数、分项指数、评级等数据 1、时间&#xff1a;更新至2022年&#xff0c;四份数据&#xff0c;具体时间见下文 2、范围&#xff1a;上市公司 3、具体数据&#xff1a; 2000-2022年上市公司内部控制指数评级及评分数据 2007…

【JVM篇】什么是jvm

文章目录 &#x1f354;什么是Java虚拟机&#x1f6f8;Java虚拟机有什么用&#x1f339;Java虚拟机的功能&#x1f388;Java虚拟机的组成 &#x1f354;什么是Java虚拟机 JVM指的是Java虚拟机&#xff0c;本质上是一个运行在计算机上的程序&#xff0c;可以运行 Java字节码文件…

NAT——网络地址转换、NAPT

网络地址转换 NAT (Network Address Translation) 1994 年提出。 需要在专用网连接到互联网的路由器上安装 NAT 软件。 装有 NAT 软件的路由器叫做 NAT路由器&#xff0c;它至少有一个有效的外部全球 IP 地址。 所有使用本地地址的主机在和外界通信时&#xff0c;都要在 NA…

【教程】MySQL数据库学习笔记(三)——数据定义语言DDL(持续更新)

写在前面&#xff1a; 如果文章对你有帮助&#xff0c;记得点赞关注加收藏一波&#xff0c;利于以后需要的时候复习&#xff0c;多谢支持&#xff01; 【MySQL数据库学习】系列文章 第一章 《认识与环境搭建》 第二章 《数据类型》 第三章 《数据定义语言DDL》 文章目录 【MyS…

docker 1:介绍

docker 1&#xff1a;介绍 docker解决哪些问题&#xff1a; 传统APP在安装到不同电脑的时候可能会遇到依赖问题&#xff0c;比如缺少VS 20xx&#xff0c;软件无法运行”的情况。docker使用容器技术将软件 依赖​打包为image包发布&#xff0c;解决了依赖问题。docker有一个官…

MATLAB|【免费】高比例可再生能源电力系统的调峰成本量化与分摊模型

目录 主要内容 部分代码 结果一览 下载链接 主要内容 程序复现文献《高比例可再生能源电力系统的调峰成本量化与分摊模型》&#xff0c;从净负荷波动的角度出发&#xff0c;建立了调峰成本的量化与分摊模型&#xff0c;构造了无调峰需求的替代场景&#xff0c;将…

在Ubuntu22.04上部署FoooCUS2.1

Fooocus 是一款基于 Gradio的图像生成软件&#xff0c;Fooocus 是对 Stable Diffusion 和 Midjourney 设计的重新思考&#xff1a; 1、从 Stable Diffusion 学习&#xff0c;该软件是离线的、开源的和免费的。 2、从 Midjourney 中学到&#xff0c;不需要手动调整&#xff0c;…

优先级队列(堆)_PriorityQueue

前言 想要看如何使用可以通过目录跳转到 PriorityQueue的使用 优先级队列 概念 队列是一种先进先出(FIFO)的数据结构&#xff0c;但有些情况下&#xff0c;操作的数据可能带有优先级&#xff0c;一般出队 列时&#xff0c;可能需要优先级高的元素先出队列&#xff0c;该中场…