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 相关文章推荐
[原创]js与自动伸缩图片 自动缩小图片的多浏览器兼容的方法总结
Mar 12 Javascript
使用Jquery搭建最佳用户体验的登录页面之记住密码自动登录功能(含后台代码)
Jul 10 Javascript
js函数返回多个返回值的示例代码
Nov 05 Javascript
jquery清空表单数据示例分享
Feb 13 Javascript
jQuery基于ajax实现带动画效果无刷新柱状图投票代码
Aug 10 Javascript
Angular ng-repeat 对象和数组遍历实例
Sep 14 Javascript
详解Vue中过度动画效果应用
May 25 Javascript
three.js实现3D模型展示的示例代码
Dec 31 Javascript
vue中的v-if和v-show的区别详解
Sep 01 Javascript
Vue SPA 初次进入加载动画实现代码
Nov 14 Javascript
JavaScript对象原型链原理详解
Feb 05 Javascript
JavaScript的Set数据结构详解
Feb 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
smarty+adodb+部分自定义类的php开发模式
2006/12/31 PHP
JSON在PHP中的应用介绍
2012/09/08 PHP
php实现约瑟夫问题的方法小结
2015/03/23 PHP
php筛选不存在的图片资源
2015/04/28 PHP
PHP使用递归方式列出当前目录下所有文件的方法
2015/06/02 PHP
6个超实用的PHP代码片段
2015/08/10 PHP
jquery实现弹出窗口效果的实例代码
2013/11/28 Javascript
js实现div闪烁原理及实现代码
2014/06/24 Javascript
javascript中定义类的方法汇总
2014/12/28 Javascript
JavaScript计时器示例分析
2015/02/05 Javascript
jquery插件orbit.js实现图片折叠轮换特效
2015/04/14 Javascript
用纯Node.JS弹出Windows系统消息提示框实例(MessageBox)
2017/05/17 Javascript
一个Js文件函数中调用另一个Js文件函数的方法演示
2017/08/14 Javascript
微信小程序之页面拦截器的示例代码
2017/09/07 Javascript
浅析Vue 生命周期
2018/06/21 Javascript
JavaScript引用类型Date常见用法实例分析
2018/08/08 Javascript
你了解vue3.0响应式数据怎么实现吗
2019/06/07 Javascript
vscode+gulp轻松开发小程序的完整步骤
2020/10/18 Javascript
[02:06]2018完美世界全国高校联赛秋季赛开始报名(附彩蛋)
2018/09/03 DOTA
Python解析nginx日志文件
2015/05/11 Python
Atom的python插件和常用插件说明
2018/07/08 Python
使用IPython或Spyder将省略号表示的内容完整输出
2020/04/20 Python
python使用bs4爬取boss直聘静态页面
2020/10/10 Python
python 实现非极大值抑制算法(Non-maximum suppression, NMS)
2020/10/15 Python
css3新增颜色表示方式分享
2014/04/15 HTML / CSS
一款纯css3实现的动画加载导航
2014/10/08 HTML / CSS
HTML5 Canvas自定义圆角矩形与虚线示例代码
2013/08/02 HTML / CSS
航空大学应届生求职信
2013/11/10 职场文书
班组安全员工作职责
2014/02/01 职场文书
另类冲刺标语
2014/06/24 职场文书
国际商务专业求职信
2014/07/15 职场文书
教师师德师风个人整改方案
2014/09/18 职场文书
2014年文秘工作总结
2014/11/25 职场文书
辞职信怎么写
2015/02/27 职场文书
2015年综治宣传月活动总结
2015/03/25 职场文书
Python+Tkinter制作专属图形化界面
2022/04/01 Python