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 数据类型转换(parseInt,parseFloat)
Jul 20 Javascript
jquery获取tagName再进行判断
May 29 Javascript
使用BootStrapValidator完成前端输入验证
Sep 28 Javascript
微信小程序 toast 详解及实例代码
Nov 09 Javascript
微信小程序 生命周期函数详解
May 24 Javascript
浅谈在koa2中实现页面渲染的全局数据
Oct 09 Javascript
详解vue移动端项目代码拆分记录
Mar 15 Javascript
微信小程序开发实现的选项卡(窗口顶部/底部TabBar)页面切换功能图文详解
May 14 Javascript
微信小程序图片加载失败时替换为默认图片的方法
Dec 09 Javascript
Vue通过配置WebSocket并实现群聊功能
Dec 31 Javascript
JavaScript中this函数使用实例解析
Feb 21 Javascript
jquery css实现流程进度条
Mar 26 jQuery
简单的三步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垃圾代码优化操作代码
2010/08/05 PHP
php常用数学函数汇总
2014/11/21 PHP
php使用google地图应用实例
2014/12/31 PHP
使用JavaScript创建新样式表和新样式规则
2016/06/14 PHP
javascript instanceof 内部机制探析
2010/10/15 Javascript
Jquery练习之表单验证实现代码
2010/12/14 Javascript
JS实现图片横向滚动效果示例代码
2013/09/04 Javascript
jquery复选框全选/取消示例
2013/12/30 Javascript
javascript表格的渲染组件
2015/07/03 Javascript
基于jquery实现在线选座订座之影院篇
2015/08/24 Javascript
详解js运算符单竖杠“|”与“||”的用法和作用介绍
2016/11/04 Javascript
自定义require函数让浏览器按需加载Js文件
2016/11/24 Javascript
JavaScript正则获取地址栏中参数的方法
2017/03/02 Javascript
深究AngularJS之ui-router详解
2017/06/13 Javascript
arctext.js实现文字平滑弯曲弧形效果的插件
2019/05/13 Javascript
[32:26]EG vs IG 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
Python打印“菱形”星号代码方法
2018/02/05 Python
python生成tensorflow输入输出的图像格式的方法
2018/02/12 Python
python删除文本中行数标签的方法
2018/05/31 Python
python正则表达式去除两个特殊字符间的内容方法
2018/12/24 Python
pthon贪吃蛇游戏详细代码
2019/01/27 Python
使用python进行广告点击率的预测的实现
2019/07/04 Python
详解如何减少python内存的消耗
2019/08/09 Python
django项目用higcharts统计最近七天文章点击量
2019/08/17 Python
Python如何实现动态数组
2019/11/02 Python
纯CSS3制作漂亮带动画效果的主机价格表
2015/04/25 HTML / CSS
西尔斯百货官网:Sears
2016/09/06 全球购物
俄罗斯购买自行车网站:Vamvelosiped
2021/01/29 全球购物
初中生个人学习的自我评价
2013/12/04 职场文书
2014党的群众路线教育实践活动总结材料
2014/10/31 职场文书
小学四年级学生评语
2014/12/26 职场文书
2015年科研工作总结范文
2015/05/13 职场文书
运动会100米加油稿
2015/07/21 职场文书
比较几种Redis集群方案
2021/06/21 Redis
用python基于appium模块开发一个自动收取能量的小助手
2021/09/25 Python
Python编程super应用场景及示例解析
2021/10/05 Python