Vuex状态管理(简单易懂、全网最全)

目录

Vuex是什么?

如何部署

如何使用

state

基础使用 

在计算属性属性中使用

使用展开运算符

mutations

基础使用 

使用辅助函数(mapMutations)简化

使用常量替代 Mutation 事件类型

getters

actions

使用辅助函数(mapActions)简化

modules

在组件中使用子模块的mutations

声明namespace


官网地址:Vuex 是什么? | Vuex (vuejs.org)

Vuex是什么?

Vuex是专门为Vue.js应用程序开发的状态管理模式。它采用集中式储存管理应用的所有组件状态,并以相应的规则保证状态以一种可预测的方式发生变化。

简单来说:状态管理就是将数据存储起来共所有的组件使用,为了保证安全使用一些规则限制一下

使用场景:保存一些需要公共使用的信息,登陆的用户信息、登录的权限信息等。

Vuex的核心:state、mutations、actions 

  • state:储存公共的一些数据
  • mutations:定义一些方法来修改state中的数据
  • actions:使用异步的方式来触发mutations中的方法进行提交

此部分的代码在vue-cli中使用

如何部署

创建vue-cli时选择部署Vuex

如果选择部署了Vuex创建的工程,在你的工程中就会多一个store文件夹,就证明可以使用。

如何使用

state

状态管理使用起来非常的简单,分为模板上使用和方法中使用

基础使用 

<template><div><!--模板上直接使用-->state中的count属性count:{{$store.state.count}}</div>
</template>
<script>
export default {//页面初始化钩子mounted() {this.fun1();},methods:{fun1(){//方法中使用console.log("state中的count属性count:",this.$store.state.count);}}
}
</script>

浏览器结果:

在计算属性属性中使用

当一个组件需要获取多个状态的时候,将这些状态声明成计算属性会有些重复和冗余。为了解决这个问题,我们可以使用 mapState 辅助函数帮助我们生成计算属性,让你少按几次键

1.先在组件中导入mapState函数。mapState函数返回的是一个对象。

<script>import {mapState} from "vuex"

 2.在组件的计算属性中使用mapState。

computed:mapState({count:"count", //可以直接使用,用处不大,还不如直接在外面用myCount(state){// 计算属性后使用。num是本地的属性return state.count+this.num}})
使用展开运算符

在之前的示例中,不方便和本地的计算属性混合使用,下面我们使用展开运算符,这样就可以和本地的计算属性一起使用

computed:{localhost(){//本地的计算属性,没有Vuex的状态参加return this.num+1},...mapState({count:"count", //可以直接使用,用处不大,还不如直接在外面用myCount(state){// 计算属性后使用。num是本地的属性return state.count+this.num}})}

mutations

state中的数据是只读的,不能直接进行修改。想要修改state数据的唯一途径就是调用mutation方法。使用commit()函数,调用mutation函数。

注意:mutation中只能执行同步方法。

基础使用 

在mutation中定义方法,在方法中修改state

mutations: {//state是状态,num是额外的参数,//额外的参数可以有多个,官网推荐使用对象类型。add(state,num){state.count=state.count+num;},//es6中的新语法,和上面方法效果一样add2({count},num){count=count+num}},

直接调用,感觉和自定义事件有些类似,也是需要写一个事件来触发这个方法

methods:{fun2(){this.$store.commit('add',2)}
}

使用辅助函数(mapMutations)简化

1.先在组件中导入mapMutations函数。

<script>import {mapMutations} from "vuex"

 2.在组件的方法中使用mapMutations配合展开运算符去使用。

methods:{fun1(){//方法中使用console.log("state中的count属性count:",this.$store.state.count);},...mapMutations({addFunc:'add',   //将`this.addFunc()`映射为`this.$store.commit('add')`reduceFunc:'reduce'})}

如果自己定义的方法名和mutations中的方法名一致,可以使用数组的方式

methods:{fun1(){//方法中使用console.log("state中的count属性count:",this.$store.state.count);},...mapMutations([add,   //将`this.add()`映射为`this.$store.commit('add')`reduceByid //传参的形式,将`this.reduceByid(id)`映射为`this.$store.commit('reduceByid ',id)`])}

使用常量替代 Mutation 事件类型

使用常量替代 mutation 事件类型在各种 Flux 实现中是很常见的模式。这样可以使 linter 之类的工具发挥作用,同时把这些常量放在单独的文件中可以让你的代码合作者对整个 app 包含的 mutation 一目了然:

 简单来说就是:多人用的时候就方便,就跟一个单独列出来的说明书一样,找的时候好找。

// mutation-types.js
export const SOME_MUTATION = 'SOME_MUTATION'
// store.js
import { createStore } from 'vuex'
import { SOME_MUTATION } from './mutation-types'const store = createStore({state: { ... },mutations: {// 我们可以使用 ES2015 风格的计算属性命名功能// 来使用一个常量作为函数名[SOME_MUTATION] (state) {// 修改 state}}
})

用不用常量取决于你——在需要多人协作的大型项目中,这会很有帮助。但如果你不喜欢,你完全可以不这样做。

getters

getters就是在vuex中的计算属性。

在vuex中声明getter方法

getters:{doubleCount(state){return state.count*2}
}

在组件中获取getters

methods:{fun3(){console.log(this.$store.getters.doubleCount)}
}

actions

  • actions中的方法可以是异步的
  • actions修改state的内容,需要通过mutations
  • 在组件中调用action需要调用dispatch()函数

1.声明action方法

actions:{delayAdd(context,num){// 模拟异步,延时2秒增加setTimeout(function(){//调用mutations中的方法context.commit('add',num)},2000)}
}

2.直接调用action方法

func4(){this.$store.dispatch('delayAdd',2)
}

使用辅助函数(mapActions)简化

1.先在组件中导入mapActions函数。

<script>import {mapActions} from "vuex"

 2.在组件的方法中使用mapActions配合展开运算符去使用,

使用效果和mapMutations类似

methods:{func4(){this.$store.dispatch('delayAdd',2)},...mapActions({delayAddLocal:'delayAdd'  //将`this.delayAddLocal()`映射为`this.$store.dispath('delayAdd')`})
}

modules

在复杂的项目中,我们不能把大量的数据堆积到store中,这样store的内容就太多,而且比较凌乱,不方便管理。所以就出现了modules。将原有的store切割成一个个的module。每个module都有自己的state、mutations、actions和getters

1.定义一个modules并导出

const storeModuleA={state:{countA:10},mutations:{addA(state){state.countA++console.log("moduleA:"+state.countA);},// 此方法和store根中的mutations方法名称一致,后面测试使用add(state){console.log("moduleA:"+state.countA);}}
}
export default storeModuleA //到导出此对象

2.在store.js中,导入并注册此modules

import Vue from 'vue'
import Vuex from 'vuex'
import storeModuleA from './storeModuleA' //导入model
Vue.use(Vuex)export default new Vuex.Store({state: {count:0},mutations: {//state是状态,num是额外的参数add(state,num){state.count=state.count+num;}},actions: {},modules: {a:storeModuleA}
})

3.在组件中使用子模块中的状态

func5(){console.log(this.$store.state.a.count)
},

在组件中使用子模块的mutations

  • 没有声明namespace的情况
    • 子模块中mutations在没有使用namespace的情况下,这些方法会注册到store根中
    • 如果模块的mutations中的方法和store根中的mutations中的方法一样,则都会被调用。
func5(){console.log(this.$store.state.a.count)this.$store.commit('addA') //和根中不一样的mutations方法名this.$store.commit('add') //和根中不样的mutations方法名
},

如果都被调用,肯定是不合适的

声明namespace

1.声明namespace并在module中添加

modules: {a:{namespace:true,...storeModuleA //使用展开运算符},b:{namespace:true,//不使用的情况state:storeModuleA.state,mutations:storeModuleA.mutations}
}

在组件中调用加上别名即可

this.$store.commit('a/add')

Wishing you a happy day

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

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

相关文章

启动Hbase出现报错

报错信息&#xff1a;slave1:head: cannot open/usr/local/hbase-2.3.1/bin/../logs/hbasewanggiqi-regionserver-slavel.out’ for reading: No such file or direslave2: head: cannot open/usr/local/hbase-2.3.1/bin/../logs/hbasewangqiqi-regionserver-slave2.out’ for …

计算机毕业论文内容参考|基于spingboot的金融投资顾问推荐系统

文章目录 导文文章重点摘要前言绪论课题背景:国内外现状与趋势:课题内容:相关技术与方法介绍系统分析系统设计系统实现总结与展望1本文总结2后续工作展望导文 计算机毕业论文内容参考|基于spingboot的金融投资顾问推荐系统 文章重点 摘要 基于SpingBoot的金融投资顾问推荐…

汽车生产RFID智能制造设计解决方案与思路

汽车行业需求 汽车行业正面临着快速变革&#xff0c;传统的汽车制造方式正在向柔性化、数字化、自动化和数据化的智能制造体系转变&#xff0c;在这个变革的背景下&#xff0c;汽车制造企业面临着物流、生产、配送和资产管理等方面的挑战&#xff0c;为了应对这些挑战&#xf…

ch579串口编程笔记

“CH579SFR.h”库文件&#xff0c;关于串口中断部分 /* UART interrupt identification values for IIR bits 3:0 */ #define UART_II_SLV_ADDR 0x0E // RO, UART0 slave address match #define UART_II_LINE_STAT 0x06 // R…

PTE SST和RL模板

目录 事实证明&#xff0c;SST分值占比很小&#xff0c;不是很需要好好练 SST的模板&#xff1a; RL模板&#xff1a; 给你一个模版供参考&#xff1a; RA技巧 为什么说日本人团结 This lecture mainly talked about the importance of words and the sound of words and…

10道高频webpack面试题快问快答

面试中的快问快答 快问快答的情景在面试中非常常见。 在面试过程中&#xff0c;面试官通常会使用快问快答的方式来快速评估面试者的基础知识、思维能力和反应速度。 这种情景下&#xff0c;面试官会提出一系列简短的问题&#xff0c;并期望面试者能够迅速做出回答或提供简洁明…

在微信小程序中怎么实现报名功能

在当今数字化时代&#xff0c;微信小程序已经成为各行各业进行营销和客户管理的必备工具。其中&#xff0c;报名功能作为微信小程序的一个重要应用场景&#xff0c;为企业或组织提供了方便、高效、实时的数据收集与管理方式。本文将为你详细介绍如何在微信小程序中实现报名功能…

MathType2024优秀的数学公式编辑工具

数学是许多学科中必不可少的一部分&#xff0c;而数学公式在学术和科学领域使用广泛。然而&#xff0c;许多人在创建和编辑数学公式时面临困难。 作为软件开发人员&#xff0c;在编写技术文档时通常也会需要输入一些复杂数学、物理公式&#xff0c;而 Word 中的公式编辑有时使…

阿里开源中间件一览

1. 概述以及竞品对比 间件介绍官方链接竞品竞品介绍异同点对比Dubbo高性能的RPC框架&#xff0c;用于实现分布式服务的调用和管理。DubbogRPC gRPC是由Google开源的一款高性能、通用的RPC框架&#xff0c;支持多种编程语言 链接&#xff1a;gRPC Dubbo更注重于服务治理和可扩展…

【Web】在前端中CSS的语法

CSS规则是由两个主要的部分构成&#xff1a;选择器、以及一条或多条声明。 选择器通常是需要改变的HTML元素。 每条声明由一个属性和一个值组成。 属性&#xff08;Property&#xff09;是需要设置的样式属性&#xff08;Style attribute&#xff09;。每一个属性有一个值。…

峰回网关数采PLC

1.网络配置 例如&#xff1a;plc地址是192.168.1.56 1.访问网关 峰回网关默认网关地址 192.168.3.18&#xff0c;或者&#xff08;10.10.253.354&#xff09;&#xff0c;本案例按照3.18讲解。 1和1相连&#xff0c;0和电脑相连 本地电脑修改ip为192.168.3.3&#xff08;和3…

ps人像怎么做渐隐的效果?

photoshop怎么制作人像渐隐的图片效果&#xff1f;渐隐效果需要使用渐变来实现&#xff0c;下面我们就来看看详细的教程。 首先&#xff0c;我们打开Photoshop&#xff0c;点击屏幕框选的【打开】&#xff0c;打开一张背景图片。 下面&#xff0c;我们点击左上角【文件】——【…

用HTML + javaScript快速完成excel表格信息除重并合并

今天突然接到一个工作&#xff0c;要把两个存储在.xls的主体信息表&#xff0c;除重后合并成一个主体信息表&#xff0c;并且补充主体类型和所在县区这两列信息。 完成这项工作的方法有很多&#xff0c;如果信息表中的信息量不大的话&#xff0c;手工处理一下也行&#xff0c;如…

CSS实现透明度效果的两种方法—— opacity 和 rgba()

在实际开发过程中&#xff0c;为了给用户呈现一些效果&#xff0c;我们需要控制元素的透明度。CSS 提供了 opacity 属性和 rgba() 函数给我们控制透明度&#xff0c;接下来通过一个例子来感受一下两种方法的区别。 <style>.transparentBox {display: inline-block;width…

sqli-labs-1

文章目录 Less-01Less-02Less-03Less-04 Less-01 1.输入不同的id值&#xff0c;可以获取不同的用户信息&#xff1a; 2.在sql后拼接’or11–&#xff0c;并没有获取到所有用户的信息&#xff0c;猜测可能用了limit语句 3.构造错误的sql语句&#xff0c;果然有limit报错: …

【腾讯云云服务器测评】- 云原生实践,快捷部署人才招聘平台容器化技术方案!

&#x1f935;‍♂️ 个人主页: AI_magician &#x1f4e1;主页地址&#xff1a; 作者简介&#xff1a;CSDN内容合伙人&#xff0c;全栈领域优质创作者。 &#x1f468;‍&#x1f4bb;景愿&#xff1a;旨在于能和更多的热爱计算机的伙伴一起成长&#xff01;&#xff01;&…

windows 下 QT Android 环境搭建(QGC 4.2.x + Qt 5.15.2)

文章目录 1. QT Creator 环境搭建2. JDK1&#xff09;官网途径&#xff1a;2) 360 安装&#xff1a;配置 3. SDK1) 通过 Android Studio2&#xff09;QT 配置中安装 姊妹篇&#xff1a; win10下新版QGC地面站环境搭建全面攻略&#xff08;v4.x.x QGroundControl地面站搭建&…

从Hugging Face下载数据测试whisper、fast_whisper耗时

时长比较短的音频&#xff1a;https://huggingface.co/datasets/PolyAI/minds14/viewer/en-US 时长比较长的音频&#xff1a;https://huggingface.co/datasets/librispeech_asr?row8 此次测试过程暂时只使用比较短的音频 使用fast_whisper测试 下载安装&#xff0c;参考官方…

【移远QuecPython】EC800M物联网开发板的硬件PWM和PWM输出BUG

【移远QuecPython】EC800M物联网开发板的硬件PWM和PWM输出BUG 文章目录 导入库初始化PWM开启PWMPWM硬件BUG硬件BUG复现原因附录&#xff1a;列表的赋值类型和py打包列表赋值BUG复现代码改进优化总结 py打包 导入库 from misc import PWM_V2或者 from misc import PWM但我觉得…

面试算法54:所有大于或等于节点的值之和

题目 给定一棵二叉搜索树&#xff0c;请将它的每个节点的值替换成树中大于或等于该节点值的所有节点值之和。假设二叉搜索树中节点的值唯一。例如&#xff0c;输入如图8.10&#xff08;a&#xff09;所示的二叉搜索树&#xff0c;由于有两个节点的值大于或等于6&#xff08;即…