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类库的顶层对象名用户体验分析
Oct 24 Javascript
javascript学习笔记(八) js内置对象
Jun 19 Javascript
JS图片无缝、平滑滚动代码
Mar 11 Javascript
jquery操作select大全
Apr 25 Javascript
JS中自定义定时器让它在某一时刻执行
Sep 02 Javascript
node.js中的fs.readdir方法使用说明
Dec 17 Javascript
jquery实现用户打分评分特效
May 28 Javascript
详解Bootstrap的iCheck插件checkbox和radio
Aug 24 Javascript
JavaScript ES6中const、let与var的对比详解
Jun 18 Javascript
layui中layer前端组件实现图片显示功能的方法分析
Oct 13 Javascript
jquery animate动画持续运动的实例
Nov 29 jQuery
使用Ajax和Jquery配合数据库实现下拉框的二级联动的示例
Jan 25 jQuery
简单的三步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使用curl存储cookie的示例
2014/03/31 PHP
摘自织梦CMS中的图片处理类
2015/08/08 PHP
php技巧小结【推荐】
2017/01/19 PHP
Laravel5中Cookie的使用详解
2017/05/03 PHP
jquery实现文本框数量加减功能的例子分享
2014/05/10 Javascript
Javascript window对象详解
2014/11/12 Javascript
JQuery节点元素属性操作方法
2015/06/11 Javascript
实例解析JS布尔对象的toString()方法和valueOf()方法
2015/10/25 Javascript
JavaScript文本框脚本编写的注意事项
2016/01/25 Javascript
JavaScript面向对象程序设计教程
2016/03/29 Javascript
switch语句的妙用(必看篇)
2016/10/03 Javascript
easyui-datagrid特殊字符不能显示的处理方法
2017/04/12 Javascript
vue复合组件实现注册表单功能
2017/11/06 Javascript
JS实现的邮箱提示补全效果示例
2018/01/30 Javascript
vue编译打包本地查看index文件的方法
2018/02/23 Javascript
p5.js入门教程之键盘交互
2018/03/19 Javascript
基于JS+HTML实现弹窗提示是否确认提交功能
2020/06/17 Javascript
vue项目查看vue版本及cli版本的实现方式
2020/10/24 Javascript
关于javascript中的promise的用法和注意事项(推荐)
2021/01/15 Javascript
[02:26]2016国际邀请赛8月3日开战 中国军团出征西雅图
2016/08/02 DOTA
[01:31:03]DOTA2完美盛典全回顾 见证十五项大奖花落谁家
2017/11/28 DOTA
Python中return self的用法详解
2018/07/27 Python
解决Python安装时报缺少DLL问题【两种解决方法】
2019/07/15 Python
基于python3实现倒叙字符串
2020/02/18 Python
Python2.6版本pip安装步骤解析
2020/08/17 Python
Python+OpenCV图像处理——实现轮廓发现
2020/10/23 Python
移动端HTML5开发神器之vconsole详解
2020/12/15 HTML / CSS
医学护理毕业生自荐信
2013/11/07 职场文书
党员学习中共十八大思想报告
2014/09/12 职场文书
学生无故旷课检讨书
2014/09/20 职场文书
企业党员岗位承诺书
2015/04/27 职场文书
农村党支部承诺书
2015/04/30 职场文书
项目战略合作意向书
2015/05/08 职场文书
2015学校年度工作总结
2015/05/11 职场文书
演讲比赛主持词
2015/06/29 职场文书
利用Python判断整数是否是回文数的3种方法总结
2021/07/07 Python