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+XMLHttpRequest+asp.net无刷新读取数据库数据
Aug 09 Javascript
jQuery之浮动窗口实现代码(两种方法)
Sep 08 Javascript
js中获取事件对象的方法小结
Mar 13 Javascript
jquery操作checkbox示例分享
Jul 21 Javascript
详解JavaScript RegExp对象
Feb 04 Javascript
Javascript实现一个简单的输入关键字添加标签效果实例
Jun 01 Javascript
backbone简介_动力节点Java学院整理
Jul 14 Javascript
Javascript将图片的绝对路径转换为base64编码的方法
Jan 11 Javascript
微信小程序网络封装(简单高效)
Aug 06 Javascript
如何使用gpu.js改善JavaScript的性能
Dec 01 Javascript
vue3.0 自适应不同分辨率电脑的操作
Feb 06 Vue.js
JS实现刷新网页后之前浏览位置保持不变示例详解
Aug 14 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 版本]
2007/03/20 PHP
PHP 批量删除 sql语句
2009/06/05 PHP
coreseek 搜索英文的问题详解
2013/06/08 PHP
浅谈web上存漏洞及原理分析、防范方法(文件名检测漏洞)
2013/06/29 PHP
PHP开启opcache提升代码性能
2015/04/26 PHP
wampserver改变默认网站目录的办法
2015/08/05 PHP
Laravel中服务提供者和门面模式的入门介绍
2017/11/06 PHP
Laravel框架基于ajax实现二级联动功能示例
2019/01/17 PHP
json简单介绍
2008/06/10 Javascript
asp.net下使用jquery 的ajax+WebService+json 实现无刷新取后台值的实现代码
2010/09/19 Javascript
关于jquery append() html时的小问题的解决方法
2010/12/16 Javascript
jQuery实现的可编辑表格完整实例
2016/06/20 Javascript
js实现适配不同的屏幕大小
2017/04/10 Javascript
Vue.2.0.5实现Class 与 Style 绑定的实例
2017/06/20 Javascript
AngularJS实现表单验证功能详解
2017/10/12 Javascript
vue不操作dom实现图片轮播的示例代码
2019/12/18 Javascript
Vue中nprogress页面加载进度条的方法实现
2020/11/13 Javascript
python list转dict示例分享
2014/01/28 Python
简单解决Python文件中文编码问题
2015/11/22 Python
Python中死锁的形成示例及死锁情况的防止
2016/06/14 Python
浅谈Python 对象内存占用
2016/07/15 Python
Python基于hashlib模块的文件MD5一致性加密验证示例
2018/02/10 Python
深入浅析python with语句简介
2018/04/11 Python
python生成ppt的方法
2018/06/07 Python
wxpython+pymysql实现用户登陆功能
2019/11/19 Python
关于Python 常用获取元素 Driver 总结
2019/11/24 Python
Pytorch之contiguous的用法
2019/12/31 Python
Python与C/C++的相互调用案例
2021/03/04 Python
美国主要的特色咖啡和茶公司:Peet’s Coffee
2020/02/14 全球购物
iHerb俄罗斯:维生素、补品和天然产品
2020/07/09 全球购物
毕业生机械建模求职信
2013/10/14 职场文书
生物制药毕业生自荐信
2013/10/16 职场文书
环保倡议书100字
2014/05/15 职场文书
安全承诺书格式
2014/05/21 职场文书
班级文化建设标语
2014/06/23 职场文书
apache基于端口创建虚拟主机的示例
2021/04/22 Servers