vue的状态管理模式vuex


Posted in Javascript onNovember 30, 2017

vuex是一个专门为vue.js设计的状态管理模式,并且也可以使用devtools进行调试。

备注:本文的示例等代码将会采用es6的语法。

链接

  1. vuex官方中文网站
  2. 使用vue和vuex实现的简易商城,仅供参考

vuex是什么?

先引用vuex官网的话:

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

状态管理模式、集中式存储管理 一听就很高大上,蛮吓人的。在我看来 vuex 就是把需要共享的变量全部存储在一个对象里面,然后将这个对象放在顶层组件中供其他组件使用。这么说吧,将vue想作是一个js文件、组件是函数,那么vuex就是一个全局变量,只是这个“全局变量”包含了一些特定的规则而已。

在vue的组件化开发中,经常会遇到需要将当前组件的状态传递给其他组件。父子组件通信时,我们通常会采用 props + emit 这种方式。但当通信双方不是父子组件甚至压根不存在相关联系,或者一个状态需要共享给多个组件时,就会非常麻烦,数据也会相当难维护,这对我们开发来讲就很不友好。vuex 这个时候就很实用,不过在使用vuex之后也带来了更多的概念和框架,需慎重!

vuex里面都有些什么内容?

Talk is cheap,Show me the code. 先来一段代码间隔下这么多的文字:

const store = new Vuex.Store({
  state: {
    name: 'weish',
    age: 22
  },
  getters: {
    personInfo(state) {
      return `My name is ${state.name}, I am ${state.age}`;
    }
  }
  mutations: {
    SET_AGE(state, age) {
      commit(age, age);
    }
  },
  actions: {
    nameAsyn({commit}) {
      setTimeout(() => {
        commit('SET_AGE', 18);
      }, 1000);
    }
  },
  modules: {
    a: modulesA
  }
}

这个就是最基本也是完整的vuex代码;vuex 包含有五个基本的对象:

  1. state:存储状态。也就是变量;
  2. getters:派生状态。也就是set、get中的get,有两个可选参数:state、getters分别可以获取state中的变量和其他的getters。外部调用方式:store.getters.personInfo()。就和vue的computed差不多;
  3. mutations:提交状态修改。也就是set、get中的set,这是vuex中唯一修改state的方式,但不支持异步操作。第一个参数默认是state。外部调用方式:store.commit('SET_AGE', 18)。和vue中的methods类似。
  4. actions:和mutations类似。不过actions支持异步操作。第一个参数默认是和store具有相同参数属性的对象。外部调用方式:store.dispatch('nameAsyn')。
  5. modules:store的子模块,内容就相当于是store的一个实例。调用方式和前面介绍的相似,只是要加上当前子模块名,如:store.a.getters.xxx()。

vue-cli中使用vuex的方式

一般来讲,我们都会采用vue-cli来进行实际的开发,在vue-cli中,开发和调用方式稍微不同。

├── index.html
├── main.js
├── components
└── store
  ├── index.js     # 我们组装模块并导出 store 的地方
  ├── state.js     # 跟级别的 state
  ├── getters.js    # 跟级别的 getter
  ├── mutation-types.js # 根级别的mutations名称(官方推荐mutions方法名使用大写)
  ├── mutations.js   # 根级别的 mutation
  ├── actions.js    # 根级别的 action
  └── modules
    ├── m1.js     # 模块1
    └── m2.js     # 模块2

state.js示例:

const state = {
  name: 'weish',
  age: 22
};

export default state;

getters.js示例(我们一般使用getters来获取state的状态,而不是直接使用state):

export const name = (state) => {
  return state.name;
}

export const age = (state) => {
  return state.age
}

export const other = (state) => {
  return `My name is ${state.name}, I am ${state.age}.`;
}

mutation-type.js示例(我们会将所有mutations的函数名放在这个文件里):

export const SET_NAME = 'SET_NAME';
export const SET_AGE = 'SET_AGE';

mutations.js示例:

import * as types from './mutation-type.js';

export default {
  [types.SET_NAME](state, name) {
    state.name = name;
  },
  [types.SET_AGE](state, age) {
    state.age = age;
  }
};

actions.js示例(异步操作、多个commit时):

import * as types from './mutation-type.js';

export default {
  nameAsyn({commit}, {age, name}) {
    commit(types.SET_NAME, name);
    commit(types.SET_AGE, age);
  }
};

modules--m1.js示例(如果不是很复杂的应用,一般来讲是不会分模块的):

export default {
  state: {},
  getters: {},
  mutations: {},
  actions: {}
};

index.js示例(组装vuex):

import vue from 'vue';
import vuex from 'vuex';
import state from './state.js';
import * as getters from './getters.js';
import mutations from './mutations.js';
import actions from './actions.js';
import m1 from './modules/m1.js';
import m2 from './modules/m2.js';
import createLogger from 'vuex/dist/logger'; // 修改日志

vue.use(vuex);

const debug = process.env.NODE_ENV !== 'production'; // 开发环境中为true,否则为false

export default new vuex.Store({
  state,
  getters,
  mutations,
  actions,
  modules: {
    m1,
    m2
  },
  plugins: debug ? [createLogger()] : [] // 开发环境下显示vuex的状态修改
});

最后将store实例挂载到main.js里面的vue上去就行了

import store from './store/index.js';

new Vue({
 el: '#app',
 store,
 render: h => h(App)
});

在vue组件中使用时,我们通常会使用mapGetters、mapActions、mapMutations,然后就可以按照vue调用methods和computed的方式去调用这些变量或函数,示例如下:

import {mapGetters, mapMutations, mapActions} from 'vuex';

/* 只写组件中的script部分 */
export default {
  computed: {
    ...mapGetters([
      name,
      age
    ])
  },
  methods: {
    ...mapMutations({
      setName: 'SET_NAME',
      setAge: 'SET_AGE'
    }),
    ...mapActions([
      nameAsyn
    ])
  }
};

总结

以上就是vuex 的相关知识,其实vuex很简单,多用几次就会熟悉了。以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
浅谈JavaScript中面向对象技术的模拟
Sep 25 Javascript
基于JQuery的Pager分页器实现代码
Jul 17 Javascript
菜鸟javascript基础资料整理3 正则
Dec 06 Javascript
仿中关村在线首页弹出式广告插件(jQuery版)
May 03 Javascript
js汉字转拼音实现代码
Feb 06 Javascript
js判断字符长度以及中英文数字等
Dec 31 Javascript
动态加载css方法实现和深入解析
Jan 18 Javascript
vuex 的简单使用
Mar 22 Javascript
详解vue中localStorage的使用方法
Nov 22 Javascript
原生js实现移动端Touch轮播图的方法步骤
Jan 03 Javascript
elementUI多选框反选的实现代码
Apr 03 Javascript
JavaScript 常见的继承方式汇总
Sep 17 Javascript
完美解决手机浏览器顶部下拉出现网页源或刷新的问题
Nov 30 #Javascript
微信小程序实现添加手机联系人功能示例
Nov 30 #Javascript
html中通过JS获取JSON数据并加载的方法
Nov 30 #Javascript
微信小程序中吸底按钮适配iPhone X方案
Nov 29 #Javascript
jQuery zTree 异步加载添加子节点重复问题
Nov 29 #jQuery
写给小白看的JavaScript异步
Nov 29 #Javascript
3种vue组件的书写形式
Nov 29 #Javascript
You might like
php读取3389的脚本
2014/05/06 PHP
php使用curl详细解析及问题汇总
2016/08/11 PHP
TP5框架实现签到功能的方法分析
2020/04/05 PHP
jquery动态添加option示例
2013/12/30 Javascript
详谈javascript中DOM的基本属性
2015/02/26 Javascript
js实现超简单的展开、折叠目录代码
2015/08/28 Javascript
JavaScript编程学习技巧汇总
2016/02/21 Javascript
js实现百度搜索提示框
2017/02/05 Javascript
微信小程序scroll-view实现横向滚动和上拉加载示例
2017/03/06 Javascript
Redux 和 Mobx的选择问题:让你不再困惑!
2017/09/18 Javascript
JavaScript数组去重算法实例小结
2018/05/07 Javascript
bootstrap tooltips在 angularJS中的使用方法
2019/04/10 Javascript
详解Vue中的基本语法和常用指令
2019/07/23 Javascript
vue实现列表滚动的过渡动画
2020/06/29 Javascript
[01:10]DOTA2次级职业联赛 - EP战队宣传片
2014/12/01 DOTA
Python获取Linux系统下的本机IP地址代码分享
2014/11/07 Python
Python中的作用域规则详解
2015/01/30 Python
Python通过正则表达式选取callback的方法
2015/07/18 Python
Python中一行和多行import模块问题
2018/04/01 Python
Python OpenCV 使用滑动条来调整函数参数的方法
2019/07/08 Python
对Python获取屏幕截图的4种方法详解
2019/08/27 Python
Python在OpenCV里实现极坐标变换功能
2019/09/02 Python
关于Pytorch MaxUnpool2d中size操作方式
2020/01/03 Python
Python爬虫获取豆瓣电影并写入excel
2020/07/31 Python
基于tensorflow __init__、build 和call的使用小结
2021/02/26 Python
德国家具在线:Fashion For Home
2017/03/11 全球购物
英国最大的经认证的有机超市:Planet Organic
2018/02/02 全球购物
美国隐形眼镜零售商:LensPure
2019/03/10 全球购物
Yves Rocher捷克官方网站:植物化妆品的创造者
2019/07/31 全球购物
软件测试常见笔试题
2012/02/04 面试题
会计职业生涯规划范文
2014/01/04 职场文书
挂牌仪式主持词
2014/03/20 职场文书
简单租房协议书
2014/04/09 职场文书
2014年纪检部工作总结
2014/11/12 职场文书
新婚姻法离婚协议书范文
2014/11/30 职场文书
MySQL数据库中varchar类型的数字比较大小的方法
2021/11/17 MySQL