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 相关文章推荐
jquery select选中的一个小问题
Oct 11 Javascript
关于 文本框默认值 的操作js代码
Jan 12 Javascript
JQuery写动态树示例代码
Jul 31 Javascript
jquery动态加载js三种方法实例
Aug 03 Javascript
整理的比较全的event对像在ie与firefox浏览器中的区别
Nov 25 Javascript
Jquery幻灯片特效代码分享--鼠标点击按钮时切换(1)
Aug 15 Javascript
js实现不重复导入的方法
Mar 02 Javascript
el表达式 写入bootstrap表格数据页面的实例代码
Jan 11 Javascript
浅谈箭头函数写法在ReactJs中的使用
Aug 22 Javascript
javascript修改浏览器title方法 JS动态修改浏览器标题
Nov 30 Javascript
JSON数据中存在单个转义字符“\”的处理方法
Jul 11 Javascript
vue实现两个组件之间数据共享和修改操作
Nov 12 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
MySQL连接数超过限制的解决方法
2011/07/17 PHP
Windows下的PHP安装文件线程安全和非线程安全的区别
2014/04/23 PHP
PHP的PDO操作简单示例
2016/03/30 PHP
非集成环境的php运行环境(Apache配置、Mysql)搭建安装图文教程
2016/04/12 PHP
php解析base64数据生成图片的方法
2016/12/06 PHP
php反序列化长度变化尾部字符串逃逸(0CTF-2016-piapiapia)
2020/02/15 PHP
表单提交时自动复制内容到剪贴板的js代码
2007/03/16 Javascript
JavaScript iframe数据共享接口实现方法
2016/01/06 Javascript
剖析Node.js异步编程中的回调与代码设计模式
2016/02/16 Javascript
Bootstrap零基础入门教程(二)
2016/07/18 Javascript
Bootstrap CSS布局之代码
2016/12/17 Javascript
vue实现app页面切换动画效果实例
2017/05/23 Javascript
详解如何使用webpack打包Vue工程
2017/05/27 Javascript
JS实现求数组起始项到终止项之和的方法【基于数组扩展函数】
2017/06/13 Javascript
微信小程序开发之自定义tabBar的实现
2018/09/06 Javascript
从零开始在NPM上发布一个Vue组件的方法步骤
2018/12/20 Javascript
Vue使用.sync 实现父子组件的双向绑定数据问题
2019/04/04 Javascript
vue如何自动化打包测试环境和正式环境的dist/test文件
2019/06/06 Javascript
node实现简单的增删改查接口实例代码
2019/08/22 Javascript
VUE 实现element upload上传图片到阿里云
2020/08/12 Javascript
Vue通过阿里云oss的url连接直接下载文件并修改文件名的方法
2020/12/25 Vue.js
详细解析Python当中的数据类型和变量
2015/04/25 Python
详解Django框架中的视图级缓存
2015/07/23 Python
Python面向对象编程中关于类和方法的学习笔记
2016/06/30 Python
基于Python和Scikit-Learn的机器学习探索
2017/10/16 Python
python文件拆分与重组实例
2018/12/10 Python
详解python3 + Scrapy爬虫学习之创建项目
2019/04/12 Python
python 多线程中join()的作用
2020/10/29 Python
世界上最大的在线学习和教学市场:Udemy
2017/11/08 全球购物
求职信范文大全
2014/05/26 职场文书
入党积极分子自我批评思想汇报
2014/10/10 职场文书
2014年扫黄打非工作总结
2014/12/03 职场文书
党员公开承诺书2016
2016/03/24 职场文书
SQL实现LeetCode(176.第二高薪水)
2021/08/04 MySQL
MySQL数据库 安全管理
2022/05/06 MySQL
Python 操作pdf pdfplumber读取PDF写入Exce
2022/08/14 Python