vuex进阶知识点巩固


Posted in Javascript onMay 20, 2018

一、 Getter

我们先回忆一下上一篇的代码

computed:{
  getName(){
   return this.$store.state.name
  }
}

这里假设现在逻辑有变,我们最终期望得到的数据(getName),是基于 this.$store.state.name 上经过复杂计算得来的,刚好这个getName要在好多个地方使用,那么我们就得复制好几份.

vuex 给我们提供了 getter,请看代码 (文件位置 /src/store/index.js)

import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

export default new Vuex.Store({
 // 类似 vue 的 data
 state: {
  name: 'oldName'
 },
 // 类似 vue 的 computed -----------------以下5行为新增
 getters:{
  getReverseName: state => {
    return state.name.split('').reverse().join('')
  }
 },
 // 类似 vue 里的 mothods(同步方法)
 mutations: {
  updateName (state) {
   state.name = 'newName'
  }
 }
})

然后我们可以这样用 文件位置 /src/main.js

computed:{
  getName(){
   return this.$store.getters.getReverseName
  }
}

事实上, getter 不止单单起到封装的作用,它还跟vue的computed属性一样,会缓存结果数据, 只有当依赖改变的时候,才要重新计算.

二、 actions和$dispatch

细心的你,一定发现我之前代码里 mutations 头上的注释了 类似 vue 里的 mothods(同步方法)

为什么要在 methods 后面备注是同步方法呢? mutation只能是同步的函数,只能是同步的函数,只能是同步的函数!! 请看vuex的解释:

现在想象,我们正在 debug 一个 app 并且观察 devtool 中的 mutation 日志。每一条 mutation 被记录, devtools 都需要捕捉到前一状态和后一状态的快照。然而,在上面的例子中 mutation 中的异步函数中的回调让这不 可能完成:因为当 mutation 触发的时候,回调函数还没有被调用,devtools 不知道什么时候回调函数实际上被调 用——实质上任何在回调函数中进行的状态的改变都是不可追踪的。
那么如果我们想触发一个异步的操作呢? 答案是: action + $dispatch, 我们继续修改store/index.js下面的代码

文件位置 /src/store/index.js

import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

export default new Vuex.Store({
 // 类似 vue 的 data
 state: {
  name: 'oldName'
 },
 // 类似 vue 的 computed
 getters:{
  getReverseName: state => {
    return state.name.split('').reverse().join('')
  }
 },
 // 类似 vue 里的 mothods(同步方法)
 mutations: {
  updateName (state) {
   state.name = 'newName'
  }
 },
 // 类似 vue 里的 mothods(异步方法) -------- 以下7行为新增
 actions: {
  updateNameAsync ({ commit }) {
   setTimeout(() => {
    commit('updateName')
   }, 1000)
  }
 }
})

然后我们可以再我们的vue页面里面这样使用

methods: {
  rename () {
    this.$store.dispatch('updateNameAsync')
  }
}

三、 Module 模块化

当项目越来越大的时候,单个 store 文件,肯定不是我们想要的, 所以就有了模块化. 假设 src/store 目录下有这2个文件

moduleA.js

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

moduleB.js

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

那么我们可以把 index.js 改成这样

import moduleA from './moduleA'
import moduleB from './moduleB'

export default new Vuex.Store({
  modules: {
    moduleA,
    moduleB
  }
})

这样我们就可以很轻松的把一个store拆分成多个.

四、 总结

  1. actions 的参数是 store 对象,而 getters 和 mutations 的参数是 state .
  2. actions 和 mutations 还可以传第二个参数,具体看vuex官方文档
  3. getters/mutations/actions 都有对应的map,如: mapGetters , 具体看vuex官方文档
  4. 模块内部如果怕有命名冲突的话,可以使用命名空间, 具体看vuex官方文档
  5. vuex 其实跟 vue 非常像,有data(state),methods(mutations,actions),computed(getters),还能模块化.
Javascript 相关文章推荐
用JavaScript获取网页中的js、css、Flash等文件
Dec 20 Javascript
javascript 拖放效果实现代码
Jan 22 Javascript
Jquery插件之打造自定义的select标签
Nov 30 Javascript
Jquery实现简单的动画效果代码
Mar 18 Javascript
Javascript实现Web颜色值转换
Feb 05 Javascript
jQuery实现鼠标单击网页文字后在文本框显示的方法
May 06 Javascript
javascript实现dom动态创建省市纵向列表菜单的方法
May 14 Javascript
为什么JavaScript没有块级作用域
May 22 Javascript
JavaScript中英文字符长度统计方法示例【按照中文占2个字符】
Jan 17 Javascript
jquery获取select,option所有的value和text的实例
Mar 06 Javascript
理解javascript async的用法
Aug 22 Javascript
layui 实现表格某一列显示图标
Sep 19 Javascript
简单的三步vuex入门
May 20 #Javascript
vue项目如何刷新当前页面的方法
May 18 #Javascript
原生JS实现的碰撞检测功能示例
May 18 #Javascript
JS实现json对象数组按对象属性排序操作示例
May 18 #Javascript
vue.js使用3DES加密的方法示例
May 18 #Javascript
JS实现的3des+base64加密解密算法完整示例
May 18 #Javascript
JS实现调用本地摄像头功能示例
May 18 #Javascript
You might like
如何把PHP转成EXE文件
2006/10/09 PHP
php实现telnet功能示例
2014/04/08 PHP
laravel与thinkphp之间的区别与优缺点
2021/03/02 PHP
用js得到网页中所有的div的id
2020/10/19 Javascript
Jquery升级新版本后选择器的语法问题
2010/06/02 Javascript
js变换显示图片的实例
2013/04/16 Javascript
Javascript仿PHP $_GET获取URL中的参数
2014/05/12 Javascript
Javascript动态创建表格及删除行列的方法
2015/05/15 Javascript
使用JavaScript实现旋转的彩圈特效
2015/06/23 Javascript
JavaScript Math.round() 方法
2015/12/18 Javascript
bootstrap选项卡使用方法解析
2017/01/11 Javascript
解析NodeJS异步I/O的实现
2017/04/13 NodeJs
深入解析js轮播插件核心代码的实现过程
2017/04/14 Javascript
webpack实用小功能介绍
2018/01/02 Javascript
vue使用element-ui的el-input监听不了回车事件的解决方法
2018/01/12 Javascript
Taro集成Redux快速上手的方法示例
2018/06/21 Javascript
vue3.0中的双向数据绑定方法及优缺点
2019/08/01 Javascript
基于javascript实现碰撞检测
2020/03/12 Javascript
JS闭包原理及其使用场景解析
2020/12/03 Javascript
使用Python的web.py框架实现类似Django的ORM查询的教程
2015/05/02 Python
python递归计算N!的方法
2015/05/05 Python
使用 Python 实现微信群友统计器的思路详解
2018/09/26 Python
使用pyecharts生成Echarts网页的实例
2019/08/12 Python
python3连接MySQL8.0的两种方式
2020/02/17 Python
浅谈keras中的Merge层(实现层的相加、相减、相乘实例)
2020/05/23 Python
python中编写函数并调用的知识点总结
2021/01/13 Python
html5新特性与用法大全
2018/09/13 HTML / CSS
面料业务员岗位职责
2013/12/26 职场文书
教师党性分析材料
2014/02/04 职场文书
五星级酒店餐饮部总监的标准岗位职责
2014/02/17 职场文书
投标诚信承诺书
2014/05/26 职场文书
重点工程汇报材料
2014/08/27 职场文书
2015年民主生活会发言材料
2014/12/15 职场文书
交通事故协议书范本
2016/03/19 职场文书
2019年健身俱乐部的创业计划书
2019/08/26 职场文书
Nginx安装完成没有生成sbin目录的解决方法
2021/03/31 Servers