Vuex介绍和使用

1. 什么是Vuex

Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式和库。它解决了在大型 Vue.js 应用程序中共享和管理状态的问题,使得状态管理变得更加简单、可预测和可维护。

在 Vue.js 应用中,组件之间的通信可以通过 props 和事件进行,但随着应用的复杂性增加,组件之间的状态共享和状态变更管理变得困难。Vuex 提供了一种集中式的状态管理方案,将所有组件的状态存储在一个单一的地方,称为 “store”。

Vuex 的核心概念包括:

  1. State(状态): Vuex 使用一个单一的状态树(state tree)来存储应用的所有状态。这个状态树是响应式的,任何组件可以直接访问和监听状态的变化。
  2. Getters(获取器): Getters 允许组件从 Vuex store 中获取状态,并对其进行计算和过滤。类似于组件中的计算属性,Getters 可以缓存计算结果,避免不必要的重复计算。
  3. Mutations(变更): Mutations 是修改状态的唯一方式。它们是同步的事务,用于改变状态树中的数据。Mutations 是通过提交 (commit) 来触发,确保状态的变更是可追踪的。
  4. Actions(动作): Actions 用于处理异步操作和复杂的业务逻辑。它们可以包含多个 Mutations 的提交,用于改变状态。Actions 可以被组件调用,触发异步操作,并提交 Mutations 来改变状态。
  5. Modules(模块): Modules 允许将 Vuex store 分割成模块,每个模块拥有自己的 state、getters、mutations 和 actions。这使得大型应用程序中的状态管理更加模块化和可扩展。

通过使用 Vuex,开发人员可以更好地组织和管理应用程序的状态。它提供了一个集中式的数据流,让状态的变化变得可预测和可追踪,同时还提供了强大的工具和插件来帮助开发者调试和优化应用程序。

总结起来,Vuex 是一个用于 Vue.js 的状态管理库,通过集中管理和共享状态,简化了大型应用程序的状态管理和组件之间的通信。它的核心概念包括 State、Getters、Mutations、Actions 和 Modules,提供了一种可预测、可维护和可扩展的状态管理方案

2. 安装Vuex

注意版本问题:vuex3 - vue2、vuex4 - vue3

我这里使用的是vue2

npm install vuex@3 --save
  • vuex@3 指定要安装的 Vuex 版本是 3 版本。@3 是一个语法规则,用于指定特定的软件包版本。
  • –save 是一个命令行选项,用于将安装的软件包添加到项目的 package.json 文件的 dependencies 部分。这样做可以记录项目使用的软件包及其版本,以便在其他环境中重新安装时保持一致。

3. 使用Vuex

3.1. 建一个index.js

src目录下建一个store目录,store目录底下建一个index.js

// 初始化一个vuex的实例
import Vuex from 'vuex'
import Vue from 'vue'// 使用安装
Vue.use(Vuex)// 初始化
const store = new Vuex.Store({// 配置(state|mutations|actions)
})export default store

3.2. 全局注入Store

即使在组件中不引入store也可以使用vuex

在main.js中注入

// The Vue build version to load with the `import` command
// (runtime-only or standalone) has been set in webpack.base.conf with an alias.
import Vue from 'vue'
import App from './App'
import router from './router'
import store from './store'Vue.config.productionTip = false/* eslint-disable no-new */
new Vue({el: '#app',router,// 把store对象挂载到vue实例对象中,这样就可以在所有的组件中获取store中的数据了,store,components: { App },template: '<App/>'
})

3.3. 创建一个store

const store = new Vuex.Store({state: {// 存放状态user: {name: 'curry',age: 35}},getters: {// state的计算属性},mutations: {// 更改state中状态的逻辑,同步操作},actions: {// 提交mutation,异步操作},// 如果将store分成一个个的模块的话,则需要用到modules。//然后在每一个module中写state, getters, mutations, actions等。modules: {a: moduleA,b: moduleB,// ...}
});

主要有5个属性

  1. state – 存放状态
  2. getters – state的计算属性
  3. mutations – 更改状态的逻辑,同步操作
  4. actions – 提交mutation,异步操作
  5. mudules – 将store模块化

3.4. 使用store

<template><div><div class="hello">{{ $store.state.user.name }}</div></div>
</template>
<script>export default {}
</script>

3.5. 页面展示结果

img

4. state

State 是存储应用程序状态的对象。它是 Vuex store 的核心部分,包含了应用程序中的各种数据。

State 在 Vuex store 中充当单一数据源,即所有组件共享的数据中心。通过集中存储应用程序的状态,可以方便地管理和跟踪状态的变化,并确保状态的一致性。

state简单的说就是存放变量的地方,可以存字符串,对象、数组等

4.1. state使用示例

state中存放一个user对象

// 初始化一个vuex的实例
import Vuex from 'vuex'
import Vue from 'vue'// 使用安装
Vue.use(Vuex)// 初始化
const store = new Vuex.Store({state: {// 存放状态user: {name: 'curry',age: 35}}
});export default store

组件中展示store中的值

<template><div><div class="hello">{{ $store.state.user.name }}</div></div>
</template>
<script>export default {}
</script>

页面显示

img

4.2. mapState使用

mapState 是 Vuex 提供的一个辅助函数,用于简化在组件中访问 Vuex store 中的状态(state)。它可以帮助你将 Vuex store 中的状态映射到组件的计算属性中,使得在组件中使用状态更加方便。

<template><div><div>{{ $store.state.user.name }}</div><div>{{ user.name }}</div><div>{{ userAlias.name }}</div><div>{{ age }}</div></div>
</template><script>import {mapState} from 'vuex'export default {data () {return {num: 10}},computed: mapState({// 箭头函数user: state => state.user,// 传字符串参数 'user' 等同于 `state => state.user`userAlias: 'user',// 为了能够使用 `this` 获取局部状态,必须使用常规函数age (state) {return state.user.age + this.num}})}
</script>

img

4.3. …mapState

在 Vuex 中,…mapState 是一种 JavaScript 扩展语法,用于在组件中快速绑定 Vuex store 中的状态到计算属性。

具体而言,… 表示解构语法(destructuring syntax),而 mapState 是 Vuex 提供的辅助函数。当我们使用 …mapState 时,它会将 mapState 返回的对象展开,并将其中的属性和值分别添加到组件的计算属性中。

这种写法的好处在于它可以简化组件中的代码,避免了重复的代码和显式的属性赋值。通过使用 …mapState,我们可以将 Vuex store 中的状态快速映射到组件的计算属性,使得在组件中访问和使用状态变得更加方便和简洁。

…mapState示例:

<template><div><div>{{ user.name }}</div></div>
</template><script>import {mapState} from 'vuex'export default {data () {return {num: 10}},computed: {// 对象展开运算符:将此对象混入到外部对象中...mapState(["user"])}}
</script>

img

在上面的示例中,我们使用 …mapState 将 Vuex store 中的 user 状态映射到了组件的计算属性。这样在组件中我们可以直接使用 user,而不需要手动访问 this.$store.state.user

请注意,…mapState 仅仅是一种简写形式

你也可以选择使用完整的对象语法来手动映射状态到计算属性。

例如:

<template><div><div>{{ user.name }}</div><div>{{ age }}</div></div>
</template><script>import {mapState} from 'vuex'export default {data () {return {num: 10}},computed: {// 对象展开运算符:将此对象混入到外部对象中...mapState({user: state => state.user,age: state => state.user.age})}}
</script>

img

5. Getters

Getters 是用于从 Vuex store 中获取派生状态的函数。它们类似于组件中的计算属性,但是可以在整个应用程序中共享和重用。

通过定义 Getters,可以对存储在 Vuex store 中的状态进行一些计算、筛选或转换,以生成新的派生状态。Getters 可以访问 store 的 state,并且可以接收其他 getters 作为参数。它们可以避免在多个组件中重复编写相同的计算逻辑。

5.1. getters使用示例

// // 初始化一个vuex的实例
import Vuex from 'vuex'
import Vue from 'vue'// 使用安装
Vue.use(Vuex)// 初始化
const store = new Vuex.Store({state: {// 存放状态user: {name: 'curry',age: 35}},getters: {// 获取全名fullName: state => {return "史蒂芬" + state.user.name},userInfo: state => {return state.user.name + "今年" + state.user.age + "岁"}}});
export default store
<template><div><div>全名:{{ $store.getters.fullName }}</div><div>今年多大了:{{ $store.getters.userInfo }}</div></div>
</template><script>export default {}</script>

img

5.2. mapGetters

与mapStore用法一样的

<template><div><div>全名:{{ fullName }}</div><div>今年多大了:{{ userInfo }}</div></div>
</template><script>import {mapGetters} from 'vuex';
export default {computed: {...mapGetters(['fullName', 'userInfo'])}
}</script>

img

6. mutations

Mutations 是用于修改 Vuex store 中状态的方法。它们是 Vuex 中的同步操作,负责修改 store 的状态,并且每个 mutation 都有一个字符串类型的事件名和一个回调函数。

6.1. mutations使用示例

// // 初始化一个vuex的实例
import Vuex from 'vuex'
import Vue from 'vue'// 使用安装
Vue.use(Vuex)// 初始化
const store = new Vuex.Store({state: {// 存放状态user: {name: 'curry',age: 35}},mutations: {// 更改state中状态的逻辑,同步操作updateName(state) {state.user.name = 'James'},updateAge(state) {state.user.age = 39},resetUser(state) {state.user = {name: 'curry',age: 35}}},
});
export default store

在组件中使用这些 Mutations,你需要使用 commit 方法来触发它们

<template><div><div>姓名:{{ $store.state.user.name }}</div><div>年龄:{{ $store.state.user.age }}</div><button @click="updateName">修改姓名</button><button @click="updateAge">修改年龄</button><button @click="resetUser">重置用户</button></div>
</template><script>export default {methods: {updateName() {this.$store.commit('updateName')},updateAge() {this.$store.commit('updateAge')},resetUser() {this.$store.commit('resetUser')}}}</script>

img

7. actions

Actions 是用于处理异步操作和触发 Mutations 的方法。Actions 允许在 Vuex store 中执行异步操作,如发起网络请求、访问 API 或执行其他异步任务。

Actions 类似于 Mutations,它们也有一个字符串类型的事件名和一个回调函数。

Action 类似于 mutation,不同在于:

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

7.1. actions使用示例

// // 初始化一个vuex的实例
import Vuex from 'vuex'
import Vue from 'vue'// 使用安装
Vue.use(Vuex)// 初始化
const store = new Vuex.Store({state: {// 存放状态user: {name: 'curry',age: 35}},mutations: {// 更改state中状态的逻辑,同步操作updateName(state) {state.user.name = 'James'console.log(state.user.name)},updateAge(state) {state.user.age = 39},resetUser(state) {state.user = {name: 'curry',age: 35}}},actions: {updateName(context) {context.commit('updateName')},updateNameAsync(context) {setTimeout(() => {context.commit('updateName')}, 2000)}}});
export default store

该 Action 包含一个异步的updateNameAsync方法,点击后2秒钟返回结果

<template><div><div>姓名:{{ $store.state.user.name }}</div><div>年龄:{{ $store.state.user.age }}</div><button @click="updateName">修改姓名</button><button @click="updateNameAsync">异步修改姓名</button></div>
</template><script>export default {methods: {updateName() {// 触发action(必须调用dispatch方法)this.$store.dispatch('updateName')},updateNameAsync() {// 触发action(必须调用dispatch方法)this.$store.dispatch('updateNameAsync')}}}</script>

img

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

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

相关文章

University Program VWF仿真步骤__全加器

本教程将以全加器为例&#xff0c;选择DE2-115开发板的Cyclone IV EP4CE115F29C7 FPGA&#xff0c;使用Quartus Lite v18.1&#xff0c;循序渐进的介绍如何创建Quartus工程&#xff0c;并使用Quartus Prime软件的University Program VWF工具创建波形文件&#xff0c;对全加器的…

机器学习-线性回归法

线性回归算法 解决回归问题思想简单&#xff0c;实现容易许多强大的非线性模型的基础结果具有很好的可解释性蕴含机器学习中的很多重要思想 样本特征只有一个&#xff0c;称为&#xff1a;简单线性回归 通过分析问题&#xff0c;确定问题的损失函数或者效用函数 通过最优化…

UDP端口探活的那些细节

一 背景 商业客户反馈用categraf的net_response插件配置了udp探测, 遇到报错了&#xff0c;如图 udp是无连接的&#xff0c;无法用建立连接的形式判断端口。 插件最初的设计是需要配置udp的发送字符&#xff0c;并且配置期望返回的字符串&#xff0c; [[instances]] targets…

Java写标准输出进度条

学Java这么久了&#xff0c;突发奇想写一个 进度条 玩玩&#xff0c;下面展示一下成功吧&#xff01; Java代码实现如下 public class ProcessBar {public static void main(String[] args) {//进度条StringBuilder processBarnew StringBuilder();//进度条长度int total100;/…

2024.2.5 vscode连不上虚拟机,始终waiting for server log

昨天还好好的&#xff0c;吃着火锅&#xff0c;做着毕设&#xff0c;突然就被vscode给劫了。 起初&#xff0c;哥们跟着网上教程有模有样地删除了安装包缓存&#xff0c;还删除了.vscode-server&#xff0c;发现没卵用&#xff0c;之前都是搜那个弹窗报错。 后来发现原来是vsco…

问题:塑瓷后的牙冠要比完成的牙冠大() #学习方法#其他

问题&#xff1a;塑瓷后的牙冠要比完成的牙冠大&#xff08;&#xff09; A.10% B.10%-15% C.15%-20% D.20%-30% E.50% 参考答案如图所示

微软AD域替代方案,助力企业摆脱hw期间被攻击的窘境

在红蓝攻防演练&#xff08;hw行动&#xff09;中&#xff0c;AD域若被攻击成功&#xff0c;是其中一个扣分最多的一项内容。每年&#xff0c;宁盾都会接到大量AD在hw期间被攻击&#xff0c;甚至是被打穿的企业客户。过去&#xff0c;企业还会借助2FA双因子认证加强OA、Exchang…

一个Vivado仿真问题的debug

我最近在看Synopsys的MPHY仿真代码&#xff0c;想以此为参考写个能实现PWM-G1功能的MPHY&#xff0c;并应用于ProFPGA原型验证平台。我从中抽取了一部分代码&#xff0c;用Vivado自带的仿真器进行仿真&#xff0c;然后就遇到了一个莫名其妙的问题&#xff0c;谨以此文作为debug…

Linux 本地RStudio 工具安装远程访问

前言 RStudio Server 使你能够在 Linux 服务器上运行你所熟悉和喜爱的 RStudio IDE&#xff0c;并通过 Web 浏览器进行访问&#xff0c;从而将 RStudio IDE 的强大功能和工作效率带到基于服务器的集中式环境中。 下面介绍在Linux docker中安装RStudio Server并结合cpolar内网…

力扣231. 2 的幂(数学,二分查找,位运算)

Problem: 231. 2 的幂 文章目录 题目描述思路即解法复杂度Code 题目描述 思路即解法 思路1&#xff1a;位运算 1.易验证2的幂为正数&#xff1b; 2.易得2的幂用二进制表示只能有一个位为数字1 3.即将其转换为二进制统计其二进制1的个数 思路2&#xff1a;数学 当给定数n大于1时…

C语言操作符超详细总结

文章目录 1. 操作符的分类2. 二进制和进制转换2.1 2进制转10进制2.1.1 10进制转2进制数字 2.2 2进制转8进制和16进制2.2.1 2进制转8进制2.2.2 2进制转16进制 3. 原码、反码、补码4.移位操作符4.1 左移操作符4.2 右移操作符 5. 位操作符&#xff1a;&、|、^、~6. 逗号表达式…

LabVIEW多任务实时测控系统

LabVIEW多任务实时测控系统 面对现代化工业生产的复杂性和多变性&#xff0c;传统的测控系统已难以满足高效、精准、可靠的监控和控制需求。因此&#xff0c;开发一种基于LabVIEW的智能测控系统&#xff0c;能够提高生产效率&#xff0c;保证生产安全&#xff0c;是解决现代工…

12 ABC串口接收原理与思路

1. 串口接收原理 基本原理&#xff1a;通过数据起始位判断要是否要开始接收的数据&#xff0c;通过采样的方式确定每一位数据是0还是1。 如何判断数据起始位到来&#xff1a;通过边沿检测电路检测起始信号的下降沿 如何采样&#xff1a;一位数据采多次&#xff0c;统计得到高…

SpringBoot和SpringMVC

目录 一、springboot项目 &#xff08;1&#xff09;创建springboot项目 &#xff08;2&#xff09;目录介绍 &#xff08;3&#xff09;项目启动 &#xff08;4&#xff09;运行一个程序 &#xff08;5&#xff09;通过其他方式创建和运行springboot项目 二、SpringMVC…

掌握虚拟化与网络配置之道:深入浅出VMware及远程管理技巧

目录 虚拟机介绍 虚拟机的关键字 服务器架构的发展 为什么用虚拟机VMware 虚拟机和阿里云的区别 功能角度 价格因素 应用场景 优势方面 找到windows的服务管理 配置VMware 关于VMware安装的几个服务 vmware如何修改各种网络配置 关于NAT的详细信息(了解) NAT(网…

2024年低压电工证模拟考试题库及低压电工理论考试试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年低压电工证模拟考试题库及低压电工理论考试试题是由安全生产模拟考试一点通提供&#xff0c;低压电工证模拟考试题库是根据低压电工最新版教材&#xff0c;低压电工大纲整理而成&#xff08;含2024年低压电工证…

嵌入式单片机中晶振的工作原理

晶振在单片机中是必不可少的元器件&#xff0c;只要用到CPU的地方就必定有晶振的存在&#xff0c;那么晶振是如何工作的呢&#xff1f; 什么是晶振 晶振一般指晶体振荡器&#xff0c;晶体振荡器是指从一块石英晶体上按一定方位角切下的薄片&#xff0c;简称为晶片。 石英晶体谐…

Three.js学习8:基础贴图

一、贴图 贴图&#xff08;Texture Mapping&#xff09;&#xff0c;也翻译为纹理映射&#xff0c;“贴图”这个翻译更直观。 贴图&#xff0c;就是把图片贴在 3D 物体材质的表面&#xff0c;让它具有一定的纹理&#xff0c;来为 3D 物体添加细节的一种方法。这使我们能够添加…

Git详细讲解

文章目录 一、Git相关概念二、本地分支中文件的添加 、提交2.1 文件状态2.2 创建Git仓库2.2.1 git init2.2.2 git clone 2.3 添加操作(git add)2.4 提交操作&#xff08;git commit&#xff09;2.5 撤销操作2.5.1 撤销 add操作2.5.2 撤销 commit操作2.5.3 覆盖上一次的commit操…

ElasticSearch之倒排索引

写在前面 本文看下es的倒排索引相关内容。 1&#xff1a;正排索引和倒排索引 正排索引就是通过文档id找文档内容&#xff0c;而倒排索引就是通过文档内容找文档id&#xff0c;如下图&#xff1a; 2&#xff1a;倒排索引原理 假定我们有如下的数据&#xff1a; 为了建立倒…