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里取容器大小、定位、距离等属性搜集整理
Aug 19 Javascript
jquery实现弹出窗口效果的实例代码
Nov 28 Javascript
深入理解JavaScript系列(35):设计模式之迭代器模式详解
Mar 03 Javascript
JavaScript数据类型之基本类型和引用类型的值
Apr 01 Javascript
BootStrap 超链接变按钮的实现方法
Sep 25 Javascript
js HTML5上传示例代码完整版
Oct 10 Javascript
Angular JS 生成动态二维码的方法
Feb 23 Javascript
vue interceptor 使用教程实例详解
Sep 13 Javascript
2种在vue项目中使用百度地图的简单方法
Sep 28 Javascript
深入分析element ScrollBar滚动组件源码
Jan 22 Javascript
javascript实现动态时钟的启动和停止
Jul 29 Javascript
vue实现浏览器全屏展示功能
Nov 27 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
MySQL中create table语句的基本语法是
2007/01/15 PHP
Cakephp 执行主要流程
2010/03/24 PHP
PHP的加密方式及原理
2012/06/14 PHP
php生成年月日下载列表的方法
2015/04/24 PHP
PHP概率计算函数汇总
2015/09/13 PHP
PHP防止sql注入小技巧之sql预处理原理与实现方法分析
2019/12/13 PHP
Apache+PHP+MySQL搭建PHP开发环境图文教程
2020/08/06 PHP
JS嵌套函数调用上下文的问题解决
2014/03/26 Javascript
js判断浏览器是否支持html5
2014/08/17 Javascript
轻松创建nodejs服务器(10):处理POST请求
2014/12/18 NodeJs
浅谈Node.js:理解stream
2016/12/08 Javascript
IScroll5实现下拉刷新上拉加载的功能实例
2017/08/11 Javascript
React router动态加载组件之适配器模式的应用详解
2018/09/12 Javascript
在react中使用vue的状态管理的方法示例
2020/05/02 Javascript
js+html+css实现手动轮播和自动轮播
2020/12/30 Javascript
Python中super关键字用法实例分析
2015/05/28 Python
wxpython实现图书管理系统
2018/03/12 Python
教你使用python画一朵花送女朋友
2018/03/29 Python
Python3.4学习笔记之 idle 清屏扩展插件用法分析
2019/03/01 Python
Python 存储字符串时节省空间的方法
2019/04/23 Python
keras分类之二分类实例(Cat and dog)
2020/07/09 Python
PIP和conda 更换国内安装源的方法步骤
2020/09/21 Python
matplotlib 画动态图以及plt.ion()和plt.ioff()的使用详解
2021/01/05 Python
CSS3实现图片抽屉式效果的示例代码
2019/11/06 HTML / CSS
德国著名廉价网上药店:Shop-Apotheke
2017/07/23 全球购物
台湾三立电视电商平台:电电购
2019/09/09 全球购物
C语言中一个结构不能包含指向自己的指针吗
2012/05/25 面试题
电子商务专业个人的自我评价
2013/12/19 职场文书
集体备课反思
2014/02/12 职场文书
刑事代理授权委托书
2014/09/17 职场文书
文员转正自我鉴定怎么写
2014/09/29 职场文书
跑出一片天观后感
2015/06/08 职场文书
运动会闭幕式致辞
2015/07/29 职场文书
Python 内置函数速查表一览
2021/06/02 Python
漫画《催眠麦克风-Dawn Of Divisions》第二卷PV公开
2022/04/05 日漫
python中字符串String及其常见操作指南(方法、函数)
2022/04/06 Python