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 相关文章推荐
jquery select(列表)的操作(取值/赋值)
Aug 06 Javascript
JavaScript DOM 编程艺术(第2版)读书笔记(JavaScript的最佳实践)
Oct 01 Javascript
在JavaScript中判断整型的N种方法示例介绍
Jun 18 Javascript
在JavaScript里防止事件函数高频触发和高频调用的方法
Sep 06 Javascript
举例讲解JavaScript中关于对象操作的相关知识
Nov 16 Javascript
Vue中v-for的数据分组实例
Mar 07 Javascript
Vue 样式绑定的实现方法
Jan 15 Javascript
vue 实现搜索的结果页面支持全选与取消全选功能
May 10 Javascript
bootstrap Table实现合并相同行
Jul 19 Javascript
基于vue手写tree插件的那点事儿
Aug 20 Javascript
Vue3配置axios跨域实现过程解析
Nov 25 Vue.js
分享几个JavaScript运算符的使用技巧
Apr 24 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
最省空间的计数器
2006/10/09 PHP
隐藏Nginx或Apache以及PHP的版本号的方法
2016/01/03 PHP
thinkphp关于简单的权限判定方法
2017/04/03 PHP
php反序列化长度变化尾部字符串逃逸(0CTF-2016-piapiapia)
2020/02/15 PHP
IE和Firefox在JavaScript应用中的兼容性探讨
2008/04/01 Javascript
详解jquery事件delegate()的使用方法
2016/01/25 Javascript
扩展jquery easyui tree的搜索树节点方法(推荐)
2016/10/28 Javascript
js实现界面向原生界面发消息并跳转功能
2016/11/22 Javascript
Omi v1.0.2发布正式支持传递javascript表达式
2017/03/21 Javascript
jQuery实现字体颜色渐变效果的方法
2017/03/29 jQuery
JS实现提交表单前的数字及邮箱校检功能
2017/11/13 Javascript
js中split()方法得到的数组长度问题
2018/07/19 Javascript
javascript设计模式 ? 模板方法模式原理与用法实例分析
2020/04/23 Javascript
[52:29]DOTA2上海特级锦标赛主赛事日 - 2 胜者组第一轮#3Secret VS OG第三局
2016/03/03 DOTA
[34:08]2018DOTA2亚洲邀请赛3月29日 小组赛B组 VP VS EG
2018/03/30 DOTA
python 巧用正则寻找字符串中的特定字符的位置方法
2018/05/02 Python
[原创]Python入门教程1. 基本运算【四则运算、变量、math模块等】
2018/10/28 Python
Python利用pandas处理Excel数据的应用详解
2019/06/18 Python
python中resample函数实现重采样和降采样代码
2020/02/25 Python
Python实现上下文管理器的方法
2020/08/07 Python
Python2.6版本pip安装步骤解析
2020/08/17 Python
Python数据库封装实现代码示例解析
2020/09/05 Python
Python实现随机爬山算法
2021/01/29 Python
CSS3转换功能transform主要属性值分析及实现分享
2012/05/06 HTML / CSS
利用 CSS3 实现的无缝轮播功能代码
2017/09/25 HTML / CSS
HTML5 device access 设备访问详解
2018/05/24 HTML / CSS
HTML5的结构和语义(2):结构
2008/10/17 HTML / CSS
澳大利亚现代波西米亚风格女装网站:Bohemian Traders
2018/04/16 全球购物
Maxpeedingrods美国:高性能汽车零件
2020/02/14 全球购物
DELPHI中如何调用API,可举例说明
2014/01/16 面试题
好听的队名和口号
2014/06/09 职场文书
2015元旦文艺汇演主持稿(开场白+结束语)
2014/12/14 职场文书
爱心捐款倡议书:点燃希望,传递温暖
2019/11/04 职场文书
《中国机长》观后感:敬畏生命,敬畏职责
2019/11/12 职场文书
Django对接elasticsearch实现全文检索的示例代码
2021/08/02 Python
Redis实战高并发之扣减库存项目
2022/04/14 Redis