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 相关文章推荐
slice函数的用法 之不错的应用
Dec 29 Javascript
firefox浏览器下javascript 拖动层效果与原理分析代码
Dec 04 Javascript
AJAX分页的代码(后台asp.net)
Feb 14 Javascript
从零开始学习jQuery (四) jQuery中操作元素的属性与样式
Feb 23 Javascript
javascript 主动派发事件总结
Aug 09 Javascript
JS打开图片另存为对话框实现代码
Dec 26 Javascript
JS模式之单例模式基本用法
Jun 30 Javascript
js+div+css下拉导航菜单完整代码分享
Dec 28 Javascript
Vue Element使用icon图标教程详解(第三方)
Feb 07 Javascript
详解Angular模板引用变量及其作用域
Nov 23 Javascript
JavaScript 中判断变量是否为数字的示例代码
Oct 22 Javascript
vue 避免变量赋值后双向绑定的操作
Nov 07 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遍历并打印指定目录下所有文件实例
2014/02/10 PHP
php 5.6版本中编写一个PHP扩展的简单示例
2015/01/20 PHP
php7函数,声明,返回值等新特性介绍
2018/05/25 PHP
PHP创建文件及写入数据(覆盖写入,追加写入)的方法详解
2019/02/15 PHP
jQuery代码优化之基本事件
2011/11/01 Javascript
jquery如何通过name名称获取当前name的value值
2013/12/20 Javascript
js浮点数精确计算(加、减、乘、除)
2013/12/26 Javascript
js的alert样式如何更改如背景颜色
2014/01/22 Javascript
使用Sticker.js实现贴纸效果
2015/01/28 Javascript
jQuery toggle 代替方法
2016/03/22 Javascript
JS触摸屏网页版仿app弹窗型滚动列表选择器/日期选择器
2016/10/30 Javascript
浅谈JS函数定义方式的区别
2016/10/30 Javascript
node.js Sequelize实现单实例字段或批量自增、自减
2016/12/08 Javascript
原生js实现旋转木马轮播图效果
2017/02/27 Javascript
浅谈angular2 组件的生命周期钩子
2017/08/12 Javascript
浅谈微信页面入口文件被缓存解决方案
2018/09/29 Javascript
react 兄弟组件如何调用对方的方法示例
2018/10/23 Javascript
jQuery实现网页拼图游戏
2020/04/22 jQuery
JavaScript ES6中的简写语法总结与使用技巧
2018/12/30 Javascript
vue 返回上一页,页面样式错乱的解决
2019/11/14 Javascript
在 Vue 中使用 JSX 及使用它的原因浅析
2020/02/10 Javascript
Pyhthon中使用compileall模块编译源文件为pyc文件
2015/04/28 Python
详解Python的Django框架中manage命令的使用与扩展
2016/04/11 Python
Python的爬虫框架scrapy用21行代码写一个爬虫
2017/04/24 Python
python中装饰器级连的使用方法示例
2017/09/29 Python
在VS Code上搭建Python开发环境的方法
2018/04/06 Python
详解Numpy中的数组拼接、合并操作(concatenate, append, stack, hstack, vstack, r_, c_等)
2019/05/27 Python
通过PHP与Python代码对比的语法差异详解
2019/07/10 Python
Python实例方法、类方法、静态方法区别详解
2020/09/05 Python
美国床垫和床上用品公司:Nest Bedding
2017/06/12 全球购物
资生堂英国官网:Shiseido英国
2020/12/30 全球购物
高中军训感言200字
2014/02/23 职场文书
岗位说明书标准范本
2014/07/30 职场文书
亮剑观后感300字
2015/06/05 职场文书
2016拓展训练心得体会范文
2016/01/12 职场文书
2016保送生自荐信范文
2016/01/29 职场文书