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://xiahunao.cn/news/2776751.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Java基础常见面试题总结-集合(一)

常见的集合有哪些&#xff1f; Java集合类主要由两个接口Collection和Map派生出来的&#xff0c;Collection有三个子接口&#xff1a;List、Set、Queue。 Java集合框架图如下&#xff1a; List代表了有序可重复集合&#xff0c;可直接根据元素的索引来访问&#xff1b;Set代表…

Unity类银河恶魔城学习记录5-3 P64 Foundation of Skill System源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili SkillManager.cs using System.Collections; using System.Collections.G…

(1)短距离(<10KM)

文章目录 1.1 Bluetooth 1.2 CUAV PW-Link 1.3 ESP8266 wifi telemetry 1.4 ESP32 wifi telemetry 1.5 FrSky telemetry 1.6 Yaapu双向遥测地面站 1.7 HOTT telemetry 1.8 MSP(MultiWii 串行协议)(4.1 版) 1.9 MSP (version 4.2) 1.10 SiK Radio v1 1.11 SiK Radio …

速过计算机二级python——第9讲 详解第 2 套真题

第9讲 详解第 2 套真题 基本编程题【15 分】简单应用题【25 分】综合应用题【20 分】**问题 1**【10 分】:**问题 2【10 分】:**基本编程题【15 分】 考生文件夹下存在一个文件 PY101.py,请写代码替换横线,不修改其他代码,实现以下功能:【5 分】题目: import __________ b…

算法---回溯(正文)

1.什么是回溯&#xff1f; 回溯算法的定义就是和暴力枚举一样枚举所有可能并加撤回&#xff0c;也能和暴力一样去掉一些重复&#xff08;在之前就被筛出&#xff0c;但还要枚举这个&#xff0c;我们可以跳过这个了---------这个就是回溯剪枝&#xff09;。但为什么回溯不是暴力…

Python实现文本情感分析

前言 文本情感分析是一种重要的自然语言处理(NLP)任务&#xff0c;旨在从文本数据中推断出情感信息&#xff0c;例如正面、负面或中性情感。它在社交媒体分析、产品评论、市场调研等领域都有广泛的应用。本文将详细介绍如何使用Python进行文本情感分析&#xff0c;包括基础概念…

【从零开始学设计模式】第四章_抽象工厂模式(与工厂方法模式区分)

第四章_抽象工厂模式&#xff08;与工厂模式区分&#xff09; 1.介绍 1.1定义 为访问类提供一个创建一组相关或相互依赖对象的接口&#xff0c;且访问类无须指定所要产品的具体类 就能得到同族的不同等级的产品的模式结构&#xff1b; 1.2解决的问题 主要解决接口选择的问…

解析十六进制雷达数据格式:解析雷达数据类型。

以Cat62格式雷达数据为例&#xff0c;十六进制雷达数据部分代码&#xff1a; 3e0120bf7da4ffee0085 雷达数据使用2个字符&#xff08;1个字节&#xff09;标识&#xff0c;在这里是“3e”&#xff0c;转换为十进制数为62。 雷达数据类型父类&#xff1a; base_header_process…

Git简单了解

文章目录 1、Git概述2、Git下载与安装3、Git代码托管服务3.1、使用码云托管服务 1、Git概述 什么是Git Git是一个分布式版本控制工具&#xff0c;主要用于管理开发过程中的源代码文件&#xff08;Java类、xml文件、html页面等&#xff09;&#xff0c;在软件开发过程中被广泛使…

jvm问题自查思路

本文聊一下最近处理了一些jvm的问题上&#xff0c;将这个排查和学习过程分享一下&#xff0c;看了很多资料&#xff0c;最终都会落地到几个工具的使用&#xff0c;本文主要是从文档学习、工具学习和第三方技术验证来打开认知和实践&#xff0c;希望有用。 一、文档 不仅知道了…

新年新展望

去年其实是收获颇丰的一年&#xff0c;除了工作中各项工作都得到了很大的推进&#xff0c;个人生活中也有很多变化&#xff0c;其中还拿到了功能安全工程师的证书&#xff0c;以及功能安全经理的证书。 展望一下2024年准备输出的内容&#xff0c;一个是对ISO26262的解读&#x…

力扣刷题之旅:进阶篇(五)—— 动态规划(DP)的妙用

力扣&#xff08;LeetCode&#xff09;是一个在线编程平台&#xff0c;主要用于帮助程序员提升算法和数据结构方面的能力。以下是一些力扣上的入门题目&#xff0c;以及它们的解题代码。 --点击进入刷题地址 引言&#xff1a; 在算法的世界中&#xff0c;动态规划&#xff…

开发JSP应用程序

开发JSP应用程序 问题陈述 TecknoSoft Pvt Ltd.公司的首席技术官(CTO)John Barrett将创建一个应用程序的任务委托给了开发团队,该应用程序应在客户访问其账户详细信息前验证其客户ID和密码。客户ID应是数字形式。John希望如果所输入的客户ID或密码不正确,应向客户显示错误…

一文带你读懂JSON模块

json模块 JSON (JavaScript Object Notation)&#xff1a;是一个轻量级的数据交换格式模块&#xff0c;受javascript对象文本语法启发&#xff0c;但不属于JavaScript的子集。 常用方法&#xff1a; dump(obj,fp)&#xff1a;将对象以字符串的形式写入文件中。 load(fp)&am…

Web项目利用EasyExcel实现Excel的导出操作

早期Java使用的一些解析&#xff0c;到处excel的框架存在种种问题被遗弃&#xff0c;现在使用阿里巴巴所提供的EasyExcel已成为一种主流&#xff0c;本篇将详细介绍该功能在Web项目中如何实际应用。 详细操作文档&#xff1a;写Excel | Easy Excel 一、项目演示 在后台管理界…

【数据结构与算法-初学者指南】【附带力扣原题】队列

&#x1f389;&#x1f389;欢迎光临&#x1f389;&#x1f389; &#x1f3c5;我是苏泽&#xff0c;一位对技术充满热情的探索者和分享者。&#x1f680;&#x1f680; &#x1f31f;特别推荐给大家我的最新专栏《数据结构与算法&#xff1a;初学者入门指南》&#x1f4d8;&am…

作业2.8

1、选择题 1.1、以下选项中,不能作为合法常量的是 ____B______ A&#xff09;1.234e04 B&#xff09;1.234e0.4 C&#xff09;1.234e4 D&#xff09;1.234e0 1.2、以下定义变量并初始化错误的是_____D________。 A) char c1 ‘H’ &#xff1b; B) char c…

《MySQL 简易速速上手小册》第9章:高级 MySQL 特性和技巧(2024 最新版)

文章目录 9.1 使用存储过程和触发器9.1.1 基础知识9.1.2 重点案例&#xff1a;使用 Python 调用存储过程实现用户注册9.1.3 拓展案例 1&#xff1a;利用触发器自动记录数据更改历史9.1.4 拓展案例 2&#xff1a;使用 Python 和触发器实现数据完整性检查 9.2 管理和查询 JSON 数…

【黑马程序员】程序的内存模型

文章目录 内存分区模型分区意义代码区全局区特点代码示例 栈区特点代码示例 堆区特点代码示例 new 操作符 20240209 内存分区模型 分区意义 不同区域存放的数据&#xff0c;赋予不同的生命周期&#xff0c;给我们更大的灵活编程 代码区 处于程序未执行之前 程序编译后生成的…

文件绕过-Unsafe Fileuoload

文件上传基础 什么是文件上传 将客户端数据以文件形式封装通过网络协议发送到服务器端&#xff0c;在服务器端解析数据&#xff0c;最终在服务端硬盘上作为真实的文件保存。 通常一个文件以HTTP协议进行上传时&#xff0c;将以POST请求发送至Web服务器&#xff0c;Web服务器…