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 相关文章推荐
Flash+XML滚动新闻代码 无图片 附源码下载
Nov 22 Javascript
javascript模拟的Ping效果代码 (Web Ping)
Mar 13 Javascript
JavaScript实现的encode64加密算法实例分析
Apr 15 Javascript
jQuery插件kinMaxShow扩展效果用法实例
May 04 Javascript
jquery实现简单的全选和反选功能
Jan 02 Javascript
全面了解JavaScirpt 的垃圾(garbage collection)回收机制
Jul 11 Javascript
卸载安装Node.js与npm过程详解
Aug 15 Javascript
基于JS实现checkbox全选功能实例代码
Oct 31 Javascript
AngularJs 常用的过滤器
May 15 Javascript
利用node.js实现反向代理的方法详解
Jul 24 Javascript
JavaScript实现离开页面前提示功能【附jQuery实现方法】
Sep 26 jQuery
Vue-cli assets SubDirectory及PublicPath区别详解
Aug 18 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
mysql 搜索之简单应用
2007/04/27 PHP
php Memcache 中实现消息队列
2009/11/24 PHP
php curl选项列表(超详细)
2013/07/01 PHP
php mysql 封装类实例代码
2016/09/18 PHP
php微信开发之自定义菜单完整流程
2016/10/08 PHP
PHP面向对象程序设计(OOP)之方法重写(override)操作示例
2018/12/21 PHP
zeroclipboard复制到剪切板的flash
2010/08/04 Javascript
js window.print实现打印特定控件或内容
2013/09/16 Javascript
多个jquery.datatable共存,checkbox全选异常的快速解决方法
2013/12/10 Javascript
jQuery绑定事件不执行但alert后可以正常执行
2014/06/03 Javascript
jquery根据锚点offset值实现动画切换
2014/09/11 Javascript
vue实现后台管理权限系统及顶栏三级菜单显示功能
2019/06/19 Javascript
微信小程序点击保存图片到本机功能
2019/12/13 Javascript
javascript实现图片轮换动作方法
2020/08/07 Javascript
详解datagrid使用方法(重要)
2020/11/06 Javascript
python根据距离和时长计算配速示例
2014/02/16 Python
python多线程操作实例
2014/11/21 Python
tensorflow更改变量的值实例
2018/07/30 Python
Python实现的银行系统模拟程序完整案例
2019/04/12 Python
Python调用Windows命令打印文件
2020/02/07 Python
详解python如何引用包package
2020/06/07 Python
纯CSS3实现绘制各种图形实现代码详细整理
2012/12/26 HTML / CSS
html5实现图片转圈的动画效果——让页面动起来
2017/10/16 HTML / CSS
印度手工编织服装和家居用品商店:Fabindi
2019/10/07 全球购物
美国职棒大联盟的官方手套、球和头盔:Rawlings
2020/02/15 全球购物
Ajax主要包含了哪些技术
2014/06/12 面试题
2014派出所所长群众路线对照检查材料思想汇报
2014/09/18 职场文书
2014年初中班主任工作总结
2014/11/08 职场文书
2014年办公室文员工作总结
2014/11/12 职场文书
施工员岗位职责
2015/02/10 职场文书
库房管理员岗位职责
2015/02/12 职场文书
先进个人主要事迹怎么写
2015/11/04 职场文书
优秀的商业计划书,让融资一步到位
2019/05/07 职场文书
适合青年人白手起家的创业项目分享
2019/08/16 职场文书
MySQL中的布尔值,怎么存储false或true
2021/06/04 MySQL
Windows Server 2012 R2 磁盘分区教程
2022/04/29 Servers