vuex存取值和映射函数使用说明


Posted in Javascript onJuly 24, 2020

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

前言

vuex的执行流程

组件通过dispatch调用action,action通过commit来触发mutation,mutation来负责修改state,state修改后去重新渲染受影响的dom。

安装和引入

1、安装

npm install vuex -S

2、引入

新建:store/index.js。

import vue from 'vue';
import Vuex from 'vuex';

vue.use(Vuex);

export default new Vuex.Store({
 strict:true,//严格模式,防止直接修改state(性能很差,发布时改为false)
 state:{
 a:1,
 b:2
 },
 mutations:{
 addA(state,val){
  state.a+=val;
 },
 addB(state,val){
  state.b+=val;
 }
 },
 actions:{
 addA({commit},val){
  //调用mutations中的addA()
  commit('addA', val);
 },
 addB({commit},val){
  //调用mutations中的addB()
  commit('addB', val);
 }
 },
 //相当于computed
 getters:{
 getA(state){
  return state.a;
 },
 getB(state){
  return state.b;
 },
 count(state){
  return state.a + state.b;
 }
 },
 modules:{

 }
});

3、挂载

import store from './store';

new Vue({
 el: '#app',
 store,
 components: { App },
 template: '<App/>'
})

使用

映射关系

mapState > computed

mapGetters > computed

mapMutations > methods

mapActions > methods

State和mapState

state是vuex的核心,是统一存放数据的地方。

从store中获取值。(不推荐)

<template>
 <div>
  a:{{$store.state.a}}
  <br>
  b:{{$store.state.b}}
 </div>
</template>

官方推荐通过computed来获取,但是如果需要获取多个值就会很麻烦。

mapState

<template>
 <div>
  a:{{a}}
  <br>
  b:{{b}}
 </div>
</template>

<script>
 import {mapState} from 'vuex';
 export default {
  name: "MapState",
  computed:{
   //将store.state中的属性映射到computed
   ...mapState(['a','b'])
  }
 }
</script>

getters和mapGetters

获取getters中的值。

<div>
 a:{{$store.getters.getA}}
 <br>
 b:{{$store.getters.getB}}
 <br>
 a+b={{$store.getters.count}}
</div>

使用mapGetters映射。

<template>
 <div>
  a={{getA}}
  <br>
  b={{getB}}
  <br>
  a+b={{count}}
 </div>
</template>

<script>
 import {mapGetters} from 'vuex';
 export default {
  name: "MapGetters",
  computed:{
   //将store.getters映射到computed
   ...mapGetters(['getA','getB','count'])
  }
 }
</script>

mutations和mapMutations

通过$store.commit来触发mutation。

不推荐直接调用mutation来修改。

<template>
 <div>
  a={{$store.state.a}}
  <br>
  b={{$store.state.b}}
  <br>
  a+b={{$store.getters.count}}
  <hr>
  <button @click="$store.commit('add',5)">a+5</button>
 </div>
</template>

使用mapMutations映射。

<template>
 <div>
  a={{$store.state.a}}
  <br>
  b={{$store.state.b}}
  <br>
  a+b={{$store.getters.count}}
  <hr>
  <button @click="addA(5)">a+5</button>
 </div>
</template>

<script>
 import {mapMutations} from 'vuex';
 export default {
  name: "MapMutations",
  methods:{
   //将store.mutations映射到methods
   ...mapMutations(['addA'])
  }
 }
</script>

actions和mapActions

官方推荐通过action去触发mutation,虽然比较麻烦。

action支持异步,mutation只能同步。

通过$store.dispatch来触发action。

<button @click="$store.dispatch('addA',5)">a+5</button>

使用mapActions映射。

<template>
 <div>
  a={{$store.state.a}}
  <br>
  b={{$store.state.b}}
  <br>
  a+b={{$store.getters.count}}
  <hr>
  <button @click="$store.dispatch('addA',5)">a+5</button>
 </div>
</template>

<script>
 import {mapActions} from 'vuex';
 export default {
  name: "MapActions",
  methods:{
   //将store.actions映射到methods
   ...mapMutations(['addA'])
  }
 }
</script>

Modules

当系统比较庞大时,store会变得非常臃肿。

为了方便store的模块化管理,Vuex 允许我们将 store 分割成 modules。

每个模块拥有自己的 state、mutation、action、getter、甚至是嵌套子模块。

补充知识:向vuex存储数据和获取数据-和直接调用actions.js中的异步方法

向vuex的变量存储数据

1.在state.js中添加 userInfo: {},

2.actions.js中添加同步用户信息-将参数userInfo传递给USER_INFO

创建一个方法-不用异步方法

syncUserInfo({commit}, userInfo){
  commit(USER_INFO, {userInfo});
},

3.创建一个中间变量mutation-types.js

export const USER_INFO = 'user_info';

4.在actions.js中引入变量-USER_INFO

import {
  USER_INFO
 } from './mutation-types'

5.在mutations.js中引入变量

import {
  USER_INFO
 } from './mutation-types'

将userInfo赋值给state

[USER_INFO](state, {userInfo}) {
 state.userInfo = userInfo;
 },

6.外界直接调用actions.js中的方法 syncUserInfo

import {mapActions} from 'vuex'
 methods: {
  // 存到vuex-是个方法。需要...延展符展开
  ...mapActions(['syncUserInfo']),
 }

向vuex中获取数据

1.引入 import {mapState} from 'vuex';

2.计算属性

computed:{
 ...mapState(['userInfo'])
},

直接调用vuex-中 actions.js的异步方法--

this.$store.dispatch

created(){
  // 调用vuex-actions中的方法-刚进入app,就需要验证登录的时效性
  this.$store.dispatch('getUserInfo')
},

actions.js

// 7. 异步获取用户信息
async getUserInfo({commit}){
 const result = await getUserInfo(); // actions中调用getUserInfo方法---需要引入import
 console.log(result);
 if(result.success_code === 200){
   commit(USER_INFO, {userInfo: result.message});
 }
},

actions中调用getUserInfo方法---需要引入

import {
 getUserInfo,
} from '../api'
----------------------
api-index.js
// 2.9 获取登录的用户信息
export const getUserInfo = () => ajax(BASE_URL + '/api/user_info');

以上这篇vuex存取值和映射函数使用说明就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript中常用的运算符小结
Jan 18 Javascript
js中split函数的使用方法说明
Dec 26 Javascript
ext combobox动态加载数据库数据(附前后台)
Jun 17 Javascript
检测一个函数是否是JavaScript原生函数的小技巧
Mar 13 Javascript
轻松学习jQuery插件EasyUI EasyUI创建RSS Feed阅读器
Nov 30 Javascript
js实现跨域的多种方法
Dec 25 Javascript
jQuery获取剪贴板内容的方法
Jun 16 Javascript
jquery dataview数据视图插件使用方法
Dec 23 Javascript
vue.js中created方法作用
Mar 30 Javascript
JS中的算法与数据结构之集合(Set)实例详解
Aug 20 Javascript
关于JavaScript中异步/等待的用法与理解
Nov 18 Javascript
Ajax实现局部刷新的方法实例
Mar 31 Javascript
js实现金山打字通小游戏
Jul 24 #Javascript
vuex中store存储store.commit和store.dispatch的用法
Jul 24 #Javascript
js实现滑动滑块验证登录
Jul 24 #Javascript
解决VUEX的mapState/...mapState等取值问题
Jul 24 #Javascript
对vuex中store和$store的区别说明
Jul 24 #Javascript
小程序实现简单语音聊天的示例代码
Jul 24 #Javascript
浅谈Vuex的this.$store.commit和在Vue项目中引用公共方法
Jul 24 #Javascript
You might like
php对大文件进行读取操作的实现代码
2013/01/23 PHP
php缓冲 output_buffering和ob_start使用介绍
2014/01/30 PHP
php中的curl使用入门教程和常见用法实例
2014/04/10 PHP
jQuery 判断元素上是否绑定了事件
2009/10/28 Javascript
javascript基础第一章 JavaScript与用户端
2010/07/22 Javascript
js简易namespace管理器 实例代码
2013/06/21 Javascript
jquery特效 幻灯片效果示例代码
2013/07/16 Javascript
javascript中typeof的使用示例
2013/12/19 Javascript
jquery实现网页查找功能示例分享
2014/02/12 Javascript
js获取窗口相对于屏幕左边和上边的位置坐标
2014/05/15 Javascript
JS获取网页图片name属性的方法
2015/04/01 Javascript
vue插件vue-resource的使用笔记(小结)
2017/08/04 Javascript
angular 实现同步验证器跨字段验证的方法
2019/04/11 Javascript
解决LayUI数据表格复选框不居中显示的问题
2019/09/25 Javascript
浅谈VUE中演示v-for为什么要加key
2020/01/16 Javascript
nodejs各种姿势断点调试的方法
2020/06/18 NodeJs
[12:21]VICI vs TNC (BO3)
2018/06/07 DOTA
[52:39]完美世界DOTA2联赛PWL S3 CPG vs Forest 第一场 12.16
2020/12/17 DOTA
Python批量按比例缩小图片脚本分享
2015/05/21 Python
Django框架下在视图中使用模版的方法
2015/07/16 Python
Python 使用requests模块发送GET和POST请求的实现代码
2016/09/21 Python
python微信公众号开发简单流程
2018/03/23 Python
python入门:这篇文章带你直接学会python
2018/09/14 Python
使用tensorflow根据输入更改tensor shape
2020/06/23 Python
碧欧泉法国官网:Biotherm法国
2019/10/23 全球购物
校长先进事迹材料
2014/02/01 职场文书
珍珠鸟教学反思
2014/02/01 职场文书
学习决心书范文
2014/03/11 职场文书
环保倡议书格式范文
2014/05/14 职场文书
房屋产权证明书
2014/10/15 职场文书
督导岗位职责范本
2015/04/10 职场文书
大学三好学生主要事迹范文
2015/11/03 职场文书
2016学习依法治国心得体会
2016/01/15 职场文书
一文搞懂python异常处理、模块与包
2021/06/26 Python
python 进阶学习之python装饰器小结
2021/09/04 Python
python超详细实现完整学生成绩管理系统
2022/03/17 Python