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 Aajx访问WCF服务(GET、POST、PUT、DELETE)
Mar 16 Javascript
Jquery ajax执行顺序 返回自定义错误信息(实例讲解)
Nov 06 Javascript
JS的参数传递示例介绍
Feb 08 Javascript
学习javascript的闭包,原型,和匿名函数之旅
Oct 18 Javascript
Bootstrap CSS使用方法
Dec 23 Javascript
js控制文本框禁止输入特殊字符详解
Apr 07 Javascript
js微信应用场景之微信音乐相册案例分享
Aug 11 Javascript
Node.js成为Web应用开发最佳选择的原因
Feb 05 Javascript
Vue利用canvas实现移动端手写板的方法
May 03 Javascript
Vuex,iView UI面包屑导航使用扩展详解
Nov 04 Javascript
JS实现斐波那契数列的五种方式(小结)
Sep 09 Javascript
vue 判断两个时间插件结束时间必选大于开始时间的代码
Nov 04 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利用cookie实现访问次数统计代码
2011/05/19 PHP
php写的AES加密解密类分享
2014/06/20 PHP
destoon实现公司新闻详细页添加评论功能的方法
2014/07/15 PHP
php json_encode()函数返回json数据实例代码
2014/10/10 PHP
PHP判断是否连接上网络的方法
2015/07/01 PHP
PHP laravel中的多对多关系实例详解
2017/06/07 PHP
关于 Laravel Redis 多个进程同时取队列问题详解
2017/12/25 PHP
PHP文件上传小程序 适合初学者学习!
2019/05/23 PHP
Chrome中JSON.parse的特殊实现
2011/01/12 Javascript
jQuery入门介绍之基础知识
2015/01/13 Javascript
js实现鼠标感应图片展示的方法
2015/02/27 Javascript
在JavaScript中处理时间之setMinutes()方法的使用
2015/06/11 Javascript
详解Bootstrap glyphicons字体图标
2016/01/04 Javascript
深入理解关于javascript中apply()和call()方法的区别
2016/04/12 Javascript
Angular将填入表单的数据渲染到表格的方法
2017/09/22 Javascript
Three.js利用orbit controls插件(轨道控制)控制模型交互动作详解
2017/09/25 Javascript
vue父组件异步获取数据传给子组件的方法
2018/07/26 Javascript
详解使用VueJS开发项目中的兼容问题
2018/08/02 Javascript
Vue与React的区别和优势对比
2020/12/18 Vue.js
python 时间戳与格式化时间的转化实现代码
2016/03/23 Python
Python解惑之整数比较详解
2017/04/24 Python
python中的turtle库函数简单使用教程
2018/07/23 Python
python检测服务器端口代码实例
2019/08/31 Python
利用Python产生加密表和解密表的实现方法
2019/10/15 Python
Python 如何实现访问者模式
2020/07/28 Python
python和node.js生成当前时间戳的示例
2020/09/29 Python
e路東瀛(JAPANiCAN)香港:日本旅游、日本酒店和温泉旅馆预订
2018/11/21 全球购物
委托与事件是什么关系?为什么要使用委托
2014/04/18 面试题
如何保障Web服务器安全
2014/05/05 面试题
中学教师岗位职责
2013/11/26 职场文书
公司人事专员岗位职责
2014/08/11 职场文书
2014党员批评和自我批评思想汇报
2014/09/21 职场文书
JavaScript中时间格式化新思路toLocaleString()
2021/11/07 Javascript
frg-100简单操作(设置)说明
2022/04/05 无线电
SQL Server的存储过程与触发器以及系统函数和自定义函数
2022/04/10 SQL Server
maven 解包依赖项中的文件的解决方法
2022/07/15 Java/Android