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判断单选框或复选框是否选中方法集锦
Apr 04 Javascript
js判断变量是否未定义的代码
Mar 28 Javascript
js实现单一html页面两套css切换代码
Apr 11 Javascript
JS 如何获取radio选中后的值及不选择取radio的值
Oct 28 Javascript
JS实现简易图片轮播效果的方法
Mar 25 Javascript
在AngularJS应用中实现一些动画效果的代码
Jun 18 Javascript
JS模拟的Map类实现方法
Jun 17 Javascript
深入浅析Vue不同场景下组件间的数据交流
Aug 15 Javascript
node通过express搭建自己的服务器
Sep 30 Javascript
JS window对象简单操作完整示例
Jan 14 Javascript
Vue Render函数创建DOM节点代码实例
Jul 08 Javascript
Vue实现腾讯云点播视频上传功能的实现代码
Aug 17 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模板技术原理【一】
2008/01/10 PHP
php懒人函数 自动添加数据
2011/06/28 PHP
php+html5基于websocket实现聊天室的方法
2015/07/17 PHP
php使用escapeshellarg时中文被过滤的解决方法
2016/07/10 PHP
基于php解决json_encode中文UNICODE转码问题
2020/11/10 PHP
javascript椭圆旋转相册实现代码
2012/01/16 Javascript
js模拟C#中List的简单实例
2014/03/06 Javascript
angularjs中的单元测试实例
2014/12/06 Javascript
node.js中的console.dir方法使用说明
2014/12/10 Javascript
JQuery的ON()方法支持的所有事件罗列
2015/02/28 Javascript
js获取时间精确到秒(年月日)
2016/03/16 Javascript
JavaScript面向对象编写购物车功能
2016/08/19 Javascript
js 中rewrap-ajax.js插件实例代码
2017/10/20 Javascript
基于Vue的商品主图放大镜方案详解
2019/09/19 Javascript
用云开发Cloudbase实现小程序多图片内容安全监测的代码详解
2020/06/07 Javascript
Python3.6正式版新特性预览
2016/12/15 Python
遗传算法之Python实现代码
2017/10/10 Python
Python决策树分类算法学习
2017/12/22 Python
Python3爬虫全国地址信息
2019/01/05 Python
Django 1.10以上版本 url 配置注意事项详解
2019/08/05 Python
python3 tkinter实现添加图片和文本
2019/11/26 Python
python中的线程threading.Thread()使用详解
2019/12/17 Python
python爬虫开发之使用python爬虫库requests,urllib与今日头条搜索功能爬取搜索内容实例
2020/03/10 Python
python爬虫基础之urllib的使用
2020/12/31 Python
matplotlib bar()实现多组数据并列柱状图通用简便创建方法
2021/02/24 Python
canvas 橡皮筋式线条绘图应用方法
2019/02/13 HTML / CSS
值传递还是引用传递
2015/02/08 面试题
学习方法演讲稿
2014/05/10 职场文书
职业规划实施方案
2014/06/10 职场文书
审计班子对照检查材料
2014/08/27 职场文书
2014年评职称工作总结
2014/11/20 职场文书
护理工作个人总结
2015/03/03 职场文书
python 遍历磁盘目录的三种方法
2021/04/02 Python
MySQL query_cache_type 参数与使用详解
2021/07/01 MySQL
redis中lua脚本使用教程
2021/11/01 Redis
一定要知道的 25 个 Vue 技巧
2021/11/02 Vue.js