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

news2024/9/23 23:58:08

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.coloradmin.cn/o/1945959.html

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

相关文章

Nginx反向代理概述

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

逻辑回归推导

逻辑回归既可以看作是回归算法&#xff0c;也可以看做是分类算法。通常作为分类算法使用&#xff0c;只可以解决二分类问题。 在上述平面中&#xff0c;每个颜色代表一个类别&#xff0c;即有4个类别 将红色的做为一个类别&#xff0c;其他三个类别都统称为其他类别&#xff0…

javascript 的上下文与作用域

目录 1. 初步了解 上下文&#xff08;context&#xff09;2. 全局上下文(global context)3. 上下文栈 (context stack)4. 作用域链( scope chain)5. 作用域(scope)6. 作用域链增强7. 变量声明7.1 var 声明变量7.2 let 声明变量7.3 const 常量声明 8. 标识符查找总结 带着疑问去…

D3.高精度

1.分类情况 AB、A-B、A*a、A/b A和B指的是超大超长整数&#xff0c;长度<1e6; a的值<10000&#xff1b; 2.大整数的存储 int 变量肯定是存不了这么大的数的&#xff0c;做法是将大整数先存到string字符串&#xff0c;再使用字符串的访问方式&#xff0c;将每一位数存到…

C++树形结构(3 树的中心、重心)

目录 一.树的中心&#xff1a; 1.树的概念&#xff1a; 2.树的性质&#xff1a; 性质1&#xff1a; 性质2&#xff1a; 3.树的中心求解&#xff1a; 4.例题&#xff1a; 二.树的重心&#xff1a; 1.基础概念&#xff1a; 2.求解方法&#xff1a; 3.例题&#xff1a;…

运筹学笔记

计算的时间问题&#xff01;计算机解决了计算量的问题&#xff01; 计算机的发展对运筹学研究起到了极大的促进作用。 运筹学的一个特征之一是它常常会考虑寻求问题模型的最佳解决方案&#xff08;称为最优解&#xff09;。 没有人能成为运筹学所有方面的专家。 分析学越来越流…

反弹shell的方式——之NC反弹shell

反弹shell是指在攻击机监听某个端口&#xff0c;然后通过目标连接攻击机监听的端口&#xff0c;在攻击机反弹得到目标机的shell。通常在目标网络有防火墙或者其他因素限制&#xff0c;导致无法持续控制目标&#xff0c;或者执行命令受阻等情况时需要进行反弹shell 常见的反弹s…

Null和 Undefined 两者区别?

1、 Undefined 和 null 的 区 别 首 先 Undefined 和 Null 都 是 基 本 数 据 类 型 &#xff0c; 这 两 个 基 本 数 据 类 型 分 别 都 只 有 一 个 值 &#xff0c; 就 是 undefined 和 null。 2、undefined 代 表 的 含 义 是 未 定 义 &#xff0c; null 代 表 的 含 义 …

Python Flask入门到精通:详细教程和实战案例

前言 Flask是一个轻量级的Web框架&#xff0c;用于快速开发Web应用程序。它的设计理念是简洁、灵活和易于扩展&#xff0c;非常适合于从简单的单页应用到复杂的大型项目。通过Flask&#xff0c;可以创建各种Web应用程序&#xff0c;比如博客、电子商务网站、RESTful API等。 …

META 备受期待的 Llama 3 405B 即将发布

本心、输入输出、结果 文章目录 META 备受期待的 Llama 3 405B 即将发布前言Llama 3 405B或许会彻底改变专用模型的数据质量Llama 3 405B将形成新的模型生态系统:从基础模型到专家组合Llama 3 405B有最高效 API 的竞争Llama 3 405B 基准测试META 备受期待的 Llama 3 405B 即将…

韦东山嵌入式linux系列-具体单板的按键驱动程序(查询方式)

1 GPIO 操作回顾 &#xff08;1&#xff09;使能模块&#xff1b; &#xff08;2&#xff09;设置引脚的模式&#xff08;工作于GPIO模式&#xff09;&#xff1b; &#xff08;3&#xff09;设置GPIO本身&#xff08;输入/输出&#xff09;&#xff1b; &#xff08;4&…

Linux_make/Makefile的理解

1.make是一个命令&#xff0c;makefile是一个文件, 依赖关系和依赖方法. a.快速使用一下 i.创建一个Makefile文件(首字母也可以小写) b.依赖关系和依赖方法 i.依赖关系: 我为什么要帮你? mybin:mytest.c ii.依赖方法: 怎么帮? gcc -o mybin mytest.c make之前要注意先创建…

UE4-构建光照后导入的静态网格体变黑

当我们将我们的静态网格体导入到项目当中的时候&#xff0c;此时我们进行重新构建光照&#xff0c;我们在从新构建完光照后&#xff0c;会发现我们的静态网格体全部变黑了&#xff0c;此时是因为没有设置光照贴图分辨率和坐标索引引起的。 将General Settings中的L…

Unite 上海 强势回归

​​​ 他回归了 Unite 大会是一年一度的 Unity 全球开发者盛会。今年&#xff0c;Unite 将于 7 月盛夏点亮上海外滩。此次盛会&#xff0c;我们将以“团结”为核心&#xff0c;凝聚全球 3000 多位 Unity 社区精英的力量&#xff0c;共同开启 Unity 技术的新纪元。 在这里&am…

【C++】透析类和对象(上)

有不懂的&#xff0c;可翻阅我之前文章哦&#xff01; 个人主页&#xff1a;CSDN_小八哥向前冲 所属专栏&#xff1a;C入门 目录 类的定义 访问限定符 类域 类的实例化 实例化概念 对象大小 this指针 类的默认成员函数 构造函数 析构函数 模拟栈&#xff08;初学者&…

(最最最全)远程服务器连接新手教程-服务器基本指令、连接服务器、安装Anaconda、配置Conda、配置环境、bashrc环境变量修改(为空怎么办)

一、服务器基本指令 ls - 列出当前目录的文件和子目录cd - 改变当前目录pwd - 显示当前目录的路径df - 查看当前内存mkdir - 创建新目录rm - 删除文件cp - 复制文件mv - 移动或重命名文件 https://blog.csdn.net/weixin_43693391/article/details/133984143?ops_request_mis…

Ubuntu20.04版本升级openssh9.8p1方法

一、问题描述&#xff1a; 8.5p1 和 9.7p1 之间的openssh版本漏洞可能会导致linux系统以root身份进行RCE&#xff0c;所以需安装最新版本 二、解决方法&#xff1a; 将当前openssh版本升级到最新的版本即openssh-9.8p1版本&#xff0c;OpenSSL大版本升级且OpenSSH有新稳定版本…

今天我们聊聊C#的并发和并行

并发和并行是现代编程中的两个重要概念&#xff0c;它们可以帮助开发人员创建高效、响应迅速、高性能的应用程序。在C#中&#xff0c;这些概念尤为重要&#xff0c;因为该语言提供了对多线程和异步编程的强大支持。本文将介绍C#中并发和并行编程的关键概念、优点&#xff0c;并…

CSS(二)——CSS 背景

CSS 背景 CSS 背景属性用于定义HTML元素的背景。 CSS 背景属性 Property描述background简写属性&#xff0c;作用是将背景属性设置在一个声明中。background-attachment背景图像是否固定或者随着页面的其余部分滚动。background-color设置元素的背景颜色。background-image把…

秋招突击——7/24——知识补充——JVM类加载机制

文章目录 引言类加载机制知识点复习类的生命周期1、加载2、连接——验证3、连接——准备4、连接——解析5、初始化 类加载器和类加载机制类加载器类加载机制——双亲委派模型 面试题整理1、类加载是什么2、类加载的过程是什么3、有哪些类加载器&#xff1f;4、双亲委派模型是什…