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实现十秒钟后注册按钮可点击的方法
May 13 Javascript
json的使用小结
Jun 08 Javascript
解决拦截器对ajax请求的拦截实例详解
Dec 21 Javascript
在小程序中使用Echart图表的示例代码
Aug 02 Javascript
vuejs点击class变化的实例
Sep 05 Javascript
微信小程序MUI导航栏透明渐变功能示例(通过改变rgba的a值实现)
Jan 24 Javascript
点击按钮弹出模态框的一系列操作代码实例
Mar 29 Javascript
layui中select,radio设置不生效的解决方法
Sep 05 Javascript
js new Date()实例测试
Oct 31 Javascript
javascript中正则表达式语法详解
Aug 07 Javascript
JavaScript实现无限轮播效果
Nov 19 Javascript
关于对TypeScript泛型参数的默认值理解
Jul 15 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
gearman管理工具GearmanManager的安装与php使用方法示例
2020/02/27 PHP
JavaScript 动态将数字金额转化为中文大写金额
2009/05/14 Javascript
Mootools 1.2教程 Fx.Morph、Fx选项和Fx事件
2009/09/15 Javascript
JavaScript删除指定子元素代码实例
2015/01/13 Javascript
JavaScript获取两个数组交集的方法
2015/06/09 Javascript
javascript控制图片播放的实现代码
2020/07/29 Javascript
js实现简洁大方的二级下拉菜单效果代码
2015/09/01 Javascript
分享bootstrap学习笔记心得(组件及其属性)
2017/01/11 Javascript
基于node.js制作简单爬虫教程
2017/06/29 Javascript
Vue Spa切换页面时更改标题的实例代码
2017/07/15 Javascript
如何在 JavaScript 中更好地利用数组
2018/09/27 Javascript
浅谈Vue页面级缓存解决方案feb-alive(上)
2019/04/14 Javascript
JS去除字符串最后的逗号实例分析【四种方法】
2019/06/20 Javascript
python常用web框架简单性能测试结果分享(包含django、flask、bottle、tornado)
2014/08/25 Python
Django验证码的生成与使用示例
2017/05/20 Python
python django使用haystack:全文检索的框架(实例讲解)
2017/09/27 Python
python编程实现12306的一个小爬虫实例
2017/12/27 Python
Python列表推导式、字典推导式与集合推导式用法实例分析
2018/02/07 Python
Python基本socket通信控制操作示例
2019/01/30 Python
Python利用lxml模块爬取豆瓣读书排行榜的方法与分析
2019/04/15 Python
wxPython实现文本框基础组件
2019/11/18 Python
解决tensorflow由于未初始化变量而导致的错误问题
2020/01/06 Python
利用django创建一个简易的博客网站的示例
2020/09/29 Python
Python3利用scapy局域网实现自动多线程arp扫描功能
2021/01/21 Python
上海期货面试题
2014/01/31 面试题
求职推荐信范文
2013/12/01 职场文书
就业自荐书
2013/12/05 职场文书
初中女生自我鉴定
2013/12/19 职场文书
法学院方阵解说词
2014/01/29 职场文书
工程质量承诺书范文
2014/03/27 职场文书
2014年党员学习“三严三实”思想汇报
2014/09/15 职场文书
教师政风行风评议心得体会
2014/10/21 职场文书
优秀英文求职信范文
2015/03/19 职场文书
道士塔读书笔记
2015/06/30 职场文书
个人工作决心书
2015/09/22 职场文书
2016优秀教师先进个人事迹材料
2016/02/25 职场文书