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 autocomplate 自扩展插件、自动完成示例代码
Mar 28 Javascript
jquery获取tr中控件值并操作tr实现思路
Mar 27 Javascript
jquery通过visible来判断标签是否显示或隐藏
May 08 Javascript
详细解读AngularJS中的表单验证编程
Jun 19 Javascript
JS实现用户注册时获取短信验证码和倒计时功能
Oct 27 Javascript
利用fecha进行JS日期处理
Nov 21 Javascript
js原生代码实现轮播图的实例讲解
Jul 28 Javascript
JS库 Highlightjs 添加代码行号的实现代码
Sep 13 Javascript
浅析JS中回调函数及用法
Jul 25 Javascript
vue如何截取字符串
May 06 Javascript
微信小程序 Storage更新详解
Jul 16 Javascript
Vue父组件如何获取子组件中的变量
Jul 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
PHP连接sql server 2005环境配置及问题解决
2014/08/08 PHP
php使用Jpgraph绘制简单X-Y坐标图的方法
2015/06/10 PHP
利用Laravel生成Gravatar头像地址的优雅方法
2017/12/30 PHP
Laravel框架生命周期与原理分析
2018/06/12 PHP
Thinkphp5.0框架的Db操作实例分析【连接、增删改查、链式操作等】
2019/10/11 PHP
PHP pthreads v3使用中的一些坑和注意点分析
2020/02/21 PHP
浅析onsubmit校验表单时利用ajax的return false无效问题
2013/07/10 Javascript
jQuery修改class属性和CSS样式整理
2015/01/30 Javascript
JavaScript 里的类数组对象
2015/04/08 Javascript
JavaScript学习笔记整理之引用类型
2016/01/22 Javascript
浅谈javascript中new操作符的原理
2016/06/07 Javascript
详解javascript表单的Ajax提交插件的使用
2016/12/29 Javascript
微信小程序 Template详解及简单实例
2017/01/05 Javascript
nodejs入门教程五:连接数据库的方法分析
2017/04/24 NodeJs
对angularJs中ng-style动态改变样式的实例讲解
2018/09/30 Javascript
浅谈Webpack多页应用HMR卡住问题
2019/04/24 Javascript
Vue.js 无限滚动列表性能优化方案
2019/12/02 Javascript
Jquery高级应用Deferred对象原理及使用实例
2020/05/28 jQuery
[54:30]Liquid vs Newbee 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
利用Python的Django框架生成PDF文件的教程
2015/07/22 Python
python集合是否可变总结
2019/06/20 Python
Python使用__new__()方法为对象分配内存及返回对象的引用示例
2019/09/20 Python
python调用Matplotlib绘制分布点图
2019/10/18 Python
python kafka 多线程消费者&手动提交实例
2019/12/21 Python
python logging.info在终端没输出的解决
2020/05/12 Python
Python如何用wx模块创建文本编辑器
2020/06/07 Python
Keras load_model 导入错误的解决方式
2020/06/09 Python
python小技巧——将变量保存在本地及读取
2020/11/13 Python
Python Process创建进程的2种方法详解
2021/01/25 Python
DKNY品牌官网:纽约大都会时尚风格
2016/10/20 全球购物
德国骆驼商店:ActiveFashionWorld
2017/11/18 全球购物
数控技术应届生求职信
2013/11/13 职场文书
传媒专业推荐信范文
2013/11/23 职场文书
本科生求职信
2014/06/17 职场文书
2014物价局群众路线对照检查材料思想汇报
2014/09/21 职场文书
golang 实现菜单树的生成方式
2021/04/28 Golang