文章目录

  • 一、state
    • 1.1 state使用
    • 1.2 mapState 辅助函数
  • 二、getters
    • 2.1 getters的使用
  • 三、Mutation
    • 3.1 mutations的使用
    • 3.2 mapMutations
    • 3.3 使用常量替代Mutation事件类型
  • 四、actions
    • 4.1 action类似于mutation

一、state

1.1 state使用

引入vuex 以后,我们需要在state中定义变量,类似于vue中的data,通过state来存放状态

import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({state: { //存放状态nickname:'Simba',age:20,gender:'男'},mutations: {},actions: {},modules: {}
})

注册两个组件分别引入到app.vue中

<div id="app"><vabout> </vabout><vhome> </vhome></div>

vhome组件内容

<div class="home">{{$store.state.nickname}}</div>

vabout组件内容

<h1>{{$store.state.nickname}}:{{$store.state.age}}</h1>


如图,显示出显示出相应的内容,有了vuex,我们不必在考虑组件之间的传值,直接就可以通过$store来获取不同的数据,但是如果需要vuex中的多个数据的这时候,这样写就太啰嗦了,我们可以将它定义在computed中。

Props,methods,data和computed的初始化都是在beforeCreated和created之间完成的。
例:

<template><div class="home">{{nickname}}</div>
</template>
<script>
export default {name: 'home',computed:{nickname(){return this.$store.state.nickname}}
}

这样引入就方便了很多。

1.2 mapState 辅助函数

1.1中的方法虽然引入的时候方便了,但是computed中定义的代码还是很多,而这时候vuex又给我们提供了更简便的方法mapState方法

import {mapState} from 'vuex'
export default {name: 'home',computed: mapState(['nickname','age','gender'])
}

其中

mapState(['nickname','age','gender']) //映射哪些字段就填入哪些字段

这一句代码就相当于下面这些

nickname(){return this.$store.state.nickname}
age(){return this.$store.state.age}
gender(){return this.$store.state.gender}

记住:用mapState等这种辅助函数的时候,前面的方法名和获取的属性名是一致的。

如果我们需要自定义一个计算属性怎么办呢?怎么添加呢?
毕竟现在已经成这样了 computed: mapState([‘nickname’,‘age’,‘gender’])
这时候我们就需要es6中的展开运算符:…

computed: {   //computed是不能传参数的value(){return this.val/7
},...mapState(['nickname','age','gender'])
}

二、getters

2.1 getters的使用

getters相当于vue中的计算属性,通过getters进一步处理,得到我们想要的值,而且允许传参,第一个参数就是state

import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)export default new Vuex.Store({state: { //存放状态nickname:'Simba',firstname:'张',lastname:'三丰',age:20,gender:'男',money:1000},getters:{realname(state){return state.firstname+state.lastname},money_us(state){return (state.money/7).toFixed(2)}},mutations: {},actions: {},modules: {}
})

vue部分

computed: {  //computed是不能传参数的valued(){return this.value/7},...mapGetters(['realname','money_us'])
}

三、Mutation

3.1 mutations的使用

我们代码中定义的时候需要些mutations,它类似于vue中的methods,

mutations需要通过commit来调用其里面的方法,它也可以传入参数,第一个参数是state,第二个参数是载荷(payLoad),也就是额外的参数

代码如下

mutations: { //类似于methodsaddAge(state,payLoad){state.age+=payLoad.number}
}

template部分

<div class="home"><div><button @click="test">测试</button></div>
</div>

js部分

methods:{test(){this.$store.commit('addAge',{number:5})}
}

调用的时候第二个参数最好写成对象形式,这样我们就可以传递更多信息。

但是,这样写还是会遇到同样的问题,就是如果需要操作多个数据,就会变的麻烦,这时候我们就需要mapMutations,通过它将方法映射过来

3.2 mapMutations

跟mapState、mapGetters一样

methods:{...mapMutations(['addAge'])
}

mapMutations([‘addAge’])这一句就相当于下面的代码

addAge(payLoad){this.$store.commit('addAge',payLoad)
}

参数我们可以在调用这个方法的时候写入

<button @click="addAge({number:5})">测试</button>

这时候一些杠精就要说了,我为什么要绕一圈,从mutations里面去改state呢?我能不能直接改state呢?

比如这样:

addAge(){this.$store.state.age +=5;
}

实际看结果也可以,那我为什么从mutations里面中转一下呢?

原因如下:
① 在mutations中不仅仅能做赋值操作
② 作者在mutations中做了类似埋点操作,如果从mutations中操作的话, 能被检测到,可以更方便用调试工具调试,调试工具可以检测到实时变化,而直接改变state中的属性,则无法实时监测

注意:mutations只能写同步方法,不能写异步,比如axios、setTimeout等,这些都不能写,mutations的主要作用就是为了修改state的。

原因类似:如果在mutations中写异步,也能够调成功,但是由于是异步的,不能被调试工具追踪到,所有不推荐这样写,不利于调试,这是官方的约定。

3.3 使用常量替代Mutation事件类型

把原本的方法名称由字符串转变成常量

代码如下:

import Vue from 'vue'
import Vuex from 'vuex'
export const ADD_AGE ='addAge'
Vue.use(Vuex)
export default new Vuex.Store({state: { //存放状态nickname:'Simba',firstname:'张',lastname:'三丰',age:20,gender:'男',money:1000},getters:{ //类似于 computedrealname:state =>state.firstname+state.lastname,money_us(state){return (state.money/7).toFixed(2)}},mutations: { //类似于methods[ADD_AGE](state,payLoad){state.age+=payLoad.number}},actions: { },modules: {}
})

将addAge方法名字定义为一个常量,当调用的时候直接引入

import {ADD_AGE} from '../store'
import {mapMutations} from 'vuex'
export default {methods:{...mapMutations([ADD_AGE])}
}

这样写的好处:

① 不容易写错,字符串容易写错,而且字符串写错以后不会报错位置,而用常量替代,如果写错,eslint可以提示错误位置

用常量替代mutations的时候我我们可以新建一个文件(mutation_type.js)专门存储这些常量

mutation_type.js部分

export default {ADD_AGE: ‘addAge’
}

然后再store/index.js中引入

import MUTATION_TYPES from ‘./mutation_type’(先引入)
export let MUTATION_TYPE=MUTATION_TYPES (再导出)

这个地方有一个坑,不要将引入和导出合并成一行代码:比如这样

export { foo, bar } from 'my_module';
// 可以简单理解为
import { foo, bar } from 'my_module';
export { foo, bar };

需要注意的是,两者并不一样,写成一行以后,foo和bar实际上并没有被导入当前模块,只是相当于对外转发了这两个接口,导致当前模块不能直接使用foo和bar。

vue部分

import {MUTATION_TYPE} from '../store'
methods:{...mapMutations([MUTATION_TYPE.ADD_AGE])
}

总结一下:
① 依赖state得到新的数据,用getters(跟computed一样,只读)
② 修改state的属性值,就用mutations(同步操作)

四、actions

4.1 action类似于mutation

区别:action可以提交mutation
action也不要直接去操作state,而是去操作mutation

action包含异步操作,类似于axios请求,可以都放在action中写

action中的方法默认的就是异步,并且返回promise

代码如下

store部分

actions: {getUserInfo(){return {nickname:'Simba',age:20}}
}

在actions中定义一个方法:getUserInfo,并且返回一个对象

vue部分

created(){var res = this.getUserInfo()console.log(res)},
methods:{...mapActions(['getUserInfo'])
}

在created中调用此方法,并将结果赋值给res,打印res,结果打印出Promise

这表明,在actions中的方法,默认就是异步的,通过then获取数据

mapActions([‘getUserInfo’]) 相当于以下代码

getUserInfo(){return this.$store.dispatch(‘getUserInfo’)
}

在实际开发当中,state里面的属性值是空的,当登录以后,再进行获取对应的信息。

登录以后,需要得到用户信息,那如何得到呢?

首先进入页面的时候调用actions中的getUserInfo方法

代码如下

vue部分

created(){ this.getUserInfo()}
methods:{ ...mapActions([‘getUserInfo’])}

store部分

首先要想得到数据,那就相当于给state赋值,那首先想到的就是mutations来操作state,但是请求的接口都是axios异步,所以就不能用mutations而是用actions,通过actions来操作mutations从而操作state

export default new Vuex.Store({state: { nickname:‘’,age:0,gender:'',money:0},mutations: {setUerInfo(state,payLoad){state.nickname = payLoad.nicknamestate.age = payLoad.agestate.gender = payLoad.genderstate.money = payLoad.money}
},
actions: { //actions没有提供state当参数async getToken({commit}){var res = await axios.get('/token接口')commit('setToken',res)},
async getUserInfo(context){
//context可以理解为它是整个Store的对象.类似于this.$store,他里面包含了state,getter,mutations,actionsconst res = await axios.get('/接口url')context.commit('setUerInfo',res)
//相当于 this.$store.commit,第一个参数是方法名,第二个参数是要传入的数据context.dispatch('getToken')
//actions也可以调用自己的其他方法},}
})

运行过程,调用getUserInfo方法以后,进入actions,然后通过commit调用setUserInfo,将res(用户信息)作为参数传入传入进去,并将相对应的属性值赋值给state,完成这一过程的操作。

getUserInfo的参数也可以用解构,这样更方便

async getUserInfo({commit,dispatch}){ const res = await axios.get('/接口url')commit('setUerInfo',res) dispatch('getToken')
}

前端:一篇彻底搞懂vuex (mapState、mapGetters、mapMutations、mapActions)相关推荐

  1. vue——vuex mapState,mapGetters,mapMutations,mapActions

    当多次获取state中的数据时会出现大量的 $store.state.属性名 造成代码的冗余同时也很麻烦.就可使用 mapState(引用时使用的名称,'state中的属性名') 或 mapState ...

  2. 【Vue系列】vuex详解,一篇彻底搞懂vuex

    目录 1. 理解vuex 1.1 vuex是什么 1.2 什么是状态管理模式 1.3 什么时候用vuex 1.4 vuex工作原理 2. 应用vuex 2.1 安装vuex 2.2 搭建vuex环境 ...

  3. 这一篇彻底搞懂JS中的prototype、__proto__与constructor真的很好

    文章目录 1. 前言 2. _ _ proto _ _ 属性 3. prototype属性 4. constructor属性 5. 总结 提示:不要排斥,静下心来,认真读完,你就搞懂了!(可以先看一下 ...

  4. 《JVM系列》深入浅出类加载机制中<init>和<Clinit>的区别【一篇即可搞懂初始化机制】

    文章目录 前言:init和Clinit怎么产生的? 1.init方法 1.1.init方法什么时候被调用?用来做什么? 1.2.那么实例变量赋值操作.非静态代码块.构造器这三者,哪一个会先执行呢? 1 ...

  5. webpack5和webpack4详解(一篇全搞懂,值得收藏)

    文章目录 本篇的目的 1.webpack基础 1.1.webpack开发环境搭建 1.2.webpack配置核心 1.3.开发及生产环境分离 1.4.处理静态资源 2.webpack热门插件 2.1. ...

  6. Vuex详解,一文彻底搞懂Vuex

    一.Vuex是什么?为什么要用它? vuex官方解释 Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式 + 库.它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预 ...

  7. 一篇彻底搞懂----混合移动App干货

    一 - 混合移动App干货-详细解读 引言 本文会详细的讲解什么是混合App开发.混合App开发概念.原理.区别.为什么要学习混合App.混合App开发的几种方式以及具体的环境配置和踩坑指南等干货十足 ...

  8. this指向_前端面试之彻底搞懂this指向

    this是JavaScript中的一个关键字,但是又一个相对比较特别的关键字,不像function.var.for.if这些关键字一样,可以很清楚的搞清楚它到底是如何使用的. this会在执行上下文中 ...

  9. 几分钟搞懂Vuex(State,Mutations,Actions)

    文章目录 State Getters Mutation Actions 这是Vuex官方给出的图片,看起来有点不好理解,上详解!!!! 开始介绍之前,我们需要将Vuex挂载到Vue实例上面,这样我们才 ...

最新文章

  1. 覆盖近2亿篇论文还免费!沈向洋旗下团队「读论文神器」登B站热搜
  2. 总算会用sphinx生成文档了
  3. 我错了,有个叫 SelectSingleNode 的可以操作 xml
  4. 穿上这件全球首款「隐形衣」,做这条街最「无脸」的仔;阿里给钱给资源,求解AI安全难题...
  5. java基础---集合collection的方法介绍
  6. 【pytorch】requires_grad、volatile、no_grad()==>节点不保存梯度,即不进行反向传播
  7. 同一表单内设置两个或两个以上的提交按钮 Two submit buttons in one form
  8. php header()的用法
  9. WinSocket的一些主要函数.
  10. cmd下特殊字符串的处理
  11. 坯子库曲面推拉教程_SU曲面建模太简单?还是网友技术太强大...
  12. 如何判断机器学习数据集是否是线性的?
  13. Mugeda(木疙瘩)H5案例课—拍拍员工被玩坏了-岑远科-专题视频课程
  14. 模式识别技术是人工智能的基础技术,模式识别技术的发展潜力
  15. WRITE_ONCE READ_ONCE 函数的介绍与使用
  16. AI+PS教程!制作油画质感早餐插画
  17. 求证:原函数与逆函数具有相同的单调性
  18. 每个计算机主机只有一个硬盘吗,电脑多加一个硬盘需要重装系统吗? 电脑如何新增加一块硬盘...
  19. 如何做好会员管理与维护?
  20. 盘点那些互联网思维的餐饮新品牌

热门文章

  1. 代码随想录算法训练营day13 | 239. 滑动窗口最大值 | 347.前 K 个高频元素
  2. 74 - 键盘驱动程序的完善
  3. Zynq裸跑头文件问题
  4. 老鸟绕过把电影下载到手机里面的方法
  5. iOS GameController连接游戏手柄
  6. arcgis操作:解决空间连接所出现的问题
  7. Python接口测试实战1(上)- 接口测试理论
  8. twitteR 实例
  9. c语言读取json配置文件
  10. 对称加密算法-PBE算法