【Vue实战教程】之Vuex状态管理详解

Vuex状态管理

1 Vuex简介

1.1 什么是Vuex

Vuex是一个专为Vue.js应用程序开发的状态管理工具。它采用了集中式存储管理应用的所有的状态,并以相应的规则保证状态以一种可预测的方式发生变化。
简单来说,Vuex是一个适用于在Vue项目开发时使用的状态管理工具,如果在一个项目开发过程中频繁的使用组件传参的方式来实现数据的同步,那在项目的扩展、管理和维护方面将是一个灾难。为此,Vue为这些被多个组件频繁使用的数据提供了一个统一管理的工具,即Vuex。

在具有Vuex的Vue项目中,我们只需要把这些值定义在Vuex的状态管理对象中,就可以在整个项目的组件内被使用。

1.2 Vuex安装与使用

在使用vue-cli脚手架工具创建项目的过程中,可以手动选择安装Vuex,也可以在项目创建完成后再独立安装。
使用NPM安装Vuex命令如下:

npm i vuex --save

使用yarn安装Vuex命令如下:

yarn add vuex

在一个模块化的打包系统中,您必须显式地通过 Vue.use() 来注册 Vuex。
/src/store/index.js 文件代码如下:

import Vue from 'vue'
import Vuex from 'vuex'//挂载Vuex
Vue.use(Vuex)//创建VueX对象
const store = new Vuex.Store({state:{//存放的键值对就是所要管理的状态name:'helloVueX'}
})export default store

将store挂载到当前项目的Vue实例当中去。
/main.js 文件代码如下:

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,  //store:store 和router一样,将我们创建的Vuex实例挂载到这个vue实例中render: h => h(App)
})

在组件中使用Vuex。例如在App.vue中,我们要将state中定义的name拿来在h1标签中显示。
/App.vue 文件代码如下:

<template><div id='app'>name:<h1>{{ $store.state.name }}</h1></div>
</template>

或者要在组件方法中使用。代码如下:

//...
methods:{add(){console.log(this.$store.state.name)}
},
//...

2 Vuex核心概念

2.1 Vuex的工作流程

在Vuex对象中定义了五个成员来管理对象内的数据,其中state是用来存放数据的,剩下的成员都是用来操作state中数据的方法集。Vuex对象的成员有以下五个。

  • state:存放状态。
  • mutations:state成员操作。
  • getters:加工state成员给外界。
  • actions:异步操作。
  • modules:模块化状态管理。

Vuex的具体工作流程如下图所示。
在这里插入图片描述

在Vuex的整个工作流程中,会发现actions和mutations都是对state中的数据进行操作的方法集,但是它们被应用在不同的场景下。例如,Vue中的组件如果在调用Vuex的某个方法时,需要向服务器发送请求或者是需要进行其他的异步操作,这时就需要使用 $store.dispatch() 将数据派发的 actions 的对应方法中,以此来保证数据的同步。actions 中方法的作用就是为了让 mutations 中的方法能在异步操作中起作用。
如果在操作state数据的过程中没有异步的行为,那么就可以直接使用 $store.commit() 将数据提交到mutations中的方法,然后在方法中对数据进行操作。更新后的state数据会被渲染到组件中。

2.2 Vuex对象核心成员

在Vuex对象中一共有以下五个核心成员。

State

state的用法非常简单,就是用来存放Vuex中对数据。

Mutations

mutations是操作state数据的方法的集合,比如对该数据的修改、增加、删除等等。在mutations中定义的每个方法都有两个默认参数,语法如下:

method(state,payload){
}

形参state表示当前Vuex对象中的state;形参payload是指该方法在被调用时传递的参数。
/store/index.js 文件代码如下:

import Vue from 'vue'
import Vuex from 'vuex'Vue.use(Vuex)export default new Vuex.Store({state: {num: 0},mutations: {add(state,i){state.num += i}}
})

在组件中使用 commit() 方法来提交数据,例如,在App.vue 文件中调用 mutations 内定义的函数,代码如下:

this.$store.commit('add',10)

上面示例代码中,执行 $store.commit() 方法可以将参数“10”传递给 mutations 内的 add() 方法,并为 state 中的数据重新赋值。如果要传递多个参数,可以使用对象的数据类型进行传值,代码如下:

this.$store.commit('add',{i:10, j:11})

Getters

可以对state中的成员做一系列运算后然后在向外返回数据,Getters中定义的方法有两个默认参数,代码如下:

import Vue from 'vue'
import Vuex from 'vuex'Vue.use(Vuex)export default new Vuex.Store({state: {name: '张三',age: 20},getters: {nameInfo(state){return "姓名:"+state.name},fullInfo(state,getters){return getters.nameInfo + " 年龄:" + state.age }}
})

Getters中定义的方法默认参数分别表示:

  • state:当前VueX对象中的状态对象。
  • getters:当前getters对象,用于将getters下的其他getter拿来用。

在组件内调用Getters方法,代码如下:

this.$store.getters.fullInfo

Actions

由于直接在mutation方法中进行异步操作,将会引起数据失效。所以提供了Actions来专门进行异步操作,最终提交mutation方法。代码如下:

import Vue from 'vue'
import Vuex from 'vuex'Vue.use(Vuex)export default new Vuex.Store({state: {num: 0},mutations: {add(state,payload){state.num += payload}}actions: {add(context,payload){setTimeout(()=>{context.commit('add',payload)},2000)}}
})

Actions中的方法有两个默认参数,分别表示:

  • context:上下文(相当于箭头函数中的this)对象。
  • payload:挂载参数。

在组件内调用Actions中定义的函数,代码如下:

this.$store.dispatch('add',10)

由于是异步操作,所以我们可以为Actions中的异步方法封装为一个Promise对象,代码如下:

add(context,payload){return new Promise((resolve,reject)=>{setTimeout(()=>{context.commit('add',payload)resolve()},2000)})
}

Modules

当项目庞大,状态非常多时,可以采用模块化管理模式。Vuex 允许我们将 store 分割成模块(module)。每个模块拥有自己的 state、mutation、action、getter、甚至是嵌套子模块——从上至下进行同样方式的分割。代码如下:

import Vue from 'vue'
import Vuex from 'vuex'Vue.use(Vuex)export default new Vuex.Store({modules: {a:{state: {},getters: {},//...}}
})

在组件内调用模块a的状态,代码如下:

this.$store.state.a

而提交或者dispatch某个方法和以前一样,会自动执行所有模块内的对应type的方法,代码如下:

this.$store.commit('editKey')
this.$store.dispatch('aEditKey')

在使用Modules模块时,需要注意以下细节。
模块中mutations和getters中的方法接受的第一个参数是自身局部模块内部的state,代码如下:

models:{a:{state:{key:5},mutations:{editKey(state){state.key = 9}},....}
}

getters中方法的第三个参数是根节点状态,代码如下:

models:{a:{state:{key:5},getters:{getKeyCount(state,getter,rootState){return  rootState.key + state.key}},....}
}

actions中方法获取局部模块状态是context.state,根节点状态是context.rootState,代码如下:

models:{a:{state:{key:5},actions:{aEidtKey(context){if(context.state.key === context.rootState.key){context.commit('editKey')}}},....}
}
2.3 Vuex规范目录结构

如果把整个store都放在index.js中是不合理的,所以需要拆分。示例目录格式如下:

|- store
|-  actions.js
|-  getters.js
|-  index.js
|-  mutations.js
|-  mutations_type.js   ##该项为存放mutaions方法常量的文件,按需要可加入
|
|- modules
|- Astore.js

对应的内容存放在对应的文件中,在/store/index.js文件中存放并导出store对象。state中的数据尽量放在index.js中。而modules中的Astore局部模块状态如果多的话也可以进行细分。

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

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

相关文章

机器学习 | 回归算法原理——多项式回归

Hi&#xff0c;大家好&#xff0c;我是半亩花海。接着上次的最速下降法&#xff08;梯度下降法&#xff09;继续更新《白话机器学习的数学》这本书的学习笔记&#xff0c;在此分享多项式回归这一回归算法原理。本章的回归算法原理基于《基于广告费预测点击量》项目&#xff0c;…

Adaboost集成学习 | Matlab实现基于LSTM-Adaboost长短期记忆神经网络结合Adaboost集成学习多输入单输出时间序列预测

目录 效果一览基本介绍模型设计程序设计参考资料效果一览 基本介绍 Adaboost集成学习 | Matlab实现基于LSTM-Adaboost长短期记忆神经网络结合Adaboost集成学习时间序列预测(股票价格预测) 模型设计 步骤1: 数据准备 收集和整理历史数据。确保数据集经过适当的预处理,如归一…

【人工智能】Transformers之Pipeline(五):深度估计(depth-estimation)

目录 一、引言 二、深度估计&#xff08;depth-estimation&#xff09; 2.1 概述 2.2 技术路径 2.3 应用场景 2.4 pipeline参数 2.4.1 pipeline对象实例化参数 2.4.2 pipeline对象使用参数 2.4 pipeline实战 2.5 模型排名 三、总结 一、引言 pipeline&#xff08…

mysql JSON特性优化

有朋友问到&#xff0c;mysql如果要根据json中的某个属性过滤&#xff0c;数据量大的话&#xff0c;性能很差&#xff0c;要如何提高性能&#xff1f; 为什么要用json串&#xff1f; 由于一些特定场景&#xff0c;mysql需要用到json串&#xff0c;例如文档&#xff0c;不同的…

详解Stable Diffusion 原理图

参考英文文献&#xff1a;The Illustrated Stable Diffusion – Jay Alammar – Visualizing machine learning one concept at a time. 在这个Stable Diffusion模型的架构图中&#xff0c;VAE&#xff08;变分自编码器&#xff09;模型对应的是图中的 E 和 D 部分。 具体来说…

【BUG】已解决:NameError: name ‘python‘ is not defined

NameError: name ‘python‘ is not defined 目录 NameError: name ‘python‘ is not defined 【常见模块错误】 【解决方案】 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是博主英杰&#xff0c;211科班出身&#xff0c;就职于…

深入学习STL标准模板库

C STL standard template libaray 标准模板库 目录 C STL standard template libaray 标准模板库 一、标准容器顺序容器vectordequelistvector deque list对比 容器适配器stackqueuepriority_queue 关联容器(1)无序关联容器unordered_setunordered_multisetunordered_mapunorde…

Cxx Primer-chap7

类的基本思想是数据抽象和封装&#xff0c;前者强调interface和implement分离&#xff0c;后者在此基础上&#xff0c;强调访问控制符&#xff08;存疑&#xff09;。同时类的实现者和使用者考虑的角度不同&#xff0c;前者考虑实现效率&#xff0c;后者仅需关注功能即可&#…

C++相关概念和易错语法(23)(set、仿函数的应用、pair、multiset)

1.set和map存在的意义 &#xff08;1&#xff09;set和map的底层都是二叉搜索树&#xff0c;可以达到快速排序&#xff08;当我们按照迭代器的顺序来遍历set和map&#xff0c;其实是按照中序来遍历的&#xff0c;是排过序的&#xff09;、去重、搜索的目的。 &#xff08;2&a…

与众不同的社交体验:Facebook的新功能与新变化

在快速变化的社交媒体领域&#xff0c;Facebook不断引入创新功能和变化&#xff0c;以满足用户日益增长的需求&#xff0c;并提供与众不同的社交体验。从增强现实到数据隐私&#xff0c;Facebook的新功能和更新正在塑造一个全新的社交平台。本文将深入探讨这些新功能和变化&…

arm环境下构建Flink的Docker镜像

准备工作 资源准备 按需下载 flink&#xff0c;我的是1.17.2版本。官方说1.13版本之后的安装包兼容了arm架构&#xff0c;所以直接下载就行。 如需要cdc组件&#xff0c;提前下载好。 服务器准备 可在某云上购买arm服务器&#xff0c;2c/4g即可&#xff0c;按量付费。 带宽…

谷粒商城实战笔记-43-前端基础-Vue-使用Vue脚手架进行模块化开发

文章目录 一&#xff0c;Vue的模块化开发1&#xff0c;目录结构2&#xff0c;单文件组件 (SFC)3&#xff0c;模块化路由4&#xff0c;Vuex 模块5&#xff0c;动态组件和异步组件6&#xff0c;抽象和复用7&#xff0c;构建和打包8&#xff0c;测试9&#xff0c;文档和注释10&…

Nginx反向代理概述

正向代理与反向代理概述 正向代理&#xff1a; 定义&#xff1a;正向代理位于客户端和目标服务器之间&#xff0c;客户端的请求首先发送到代理服务器&#xff0c;然后由代理服务器转发到目标服务器&#xff0c;最后将目标服务器的响应返回给客户端。 作用&#xff1a;正向代理…

Linux - 进程的概念、状态、僵尸进程、孤儿进程及进程优先级

目录 进程基本概念 描述进程-PCB task_struct-PCB的一种 task_struct内容分类 查看进程 通过系统目录查看 通过ps命令查看 通过系统调用获取进程的PID和PPID 通过系统调用创建进程- fork初始 fork函数创建子进程 使用if进行分流 Linux进程状态 运行状态-R 浅度睡眠状态-S…

uni-app:踩坑路---关于使用了transform导致fixed定位不生效的问题

前言&#xff1a; 继续记录&#xff0c;在上篇文章中&#xff0c;弹出框遮罩层在ios上没有正确的铺盖全屏&#xff0c;是因为机型的原因&#xff0c;也和我们的代码结构有相关的问题。今天再来展示另外一个奇葩的问题。 这次我使用了在本篇博客中的弹出框组件CustomDialog.vue…

《昇思25天学习打卡营第19天|基于MobileNetv2的垃圾分类》

基于MobileNetv2的垃圾分类 本文档主要介绍垃圾分类代码开发的方法。通过读取本地图像数据作为输入&#xff0c;对图像中的垃圾物体进行检测&#xff0c;并且将检测结果图片保存到文件中。 1、实验目的 了解熟悉垃圾分类应用代码的编写&#xff08;Python语言&#xff09;&a…

【C++】:AVL树的深度解析及其实现

目录 前言一&#xff0c;AVL树的概念二&#xff0c;AVL树节点的定义三&#xff0c;AVL树的插入3.1 第一步3.2 第二步 四&#xff0c;AVL树的旋转4.1 右单旋4.2 左单旋4.3 右左双旋4.4 左右双旋4.5 插入代码的完整实现4.6 旋转总结 五&#xff0c;AVL树的验证六&#xff0c;实现…

插入和选择排序

1.1直接插入排序 void InsertSort(int* a, int n) {for (int i 1; i < n - 1; i) {//i的范围要注意的&#xff0c;防止指针越界int end i;int tmp a[end 1];while (end>0) {if (tmp< a[end]) {a[end 1] a[end];//小于就挪动&#xff0c;虽然会覆盖后面空间的值…

【Linux】通过分配虚拟内存的方式来解决因内存不够而导致部署的项目自动挂掉

多个 jar 包项目部署在同一台服务器上&#xff0c;当服务器配置低&#xff0c;内存不足时&#xff0c;有可能出现 nohup java -jar 启动的进程就莫名其妙挂掉的问题。 解决方式&#xff1a; 第一种方法&#xff1a;进行JVM调优可以改善这种情况&#xff0c;但是项目太多&…

【Android】安卓四大组件之广播知识总结

文章目录 动态注册使用BroadcastReceiver监听Intent广播注册Broadcast Receiver 静态注册自定义广播标准广播发送广播定义广播接收器注册广播接收器 有序广播修改发送方法定义第二个广播接收器注册广播接收器广播截断 使用本地广播实践-强制下线使用ActivityCollector管理所有活…