当前位置: 首页 > news >正文

孙卫琴的《精通Vue.js》读书笔记-Vuex中异步操作

本文参考孙卫琴,杜聚宾所创作的 <<精通Vue.js: Web前端开发技术详解>>一书
在这里插入图片描述
在仓库的actions选项的动作函数中,可以包含异步操作,例如以下actionA()动作函数会异步提交someMutation()更新函数:

actions: {
  actionA ({ commit }) {
    return new Promise((resolve, reject) => {
      setTimeout(() => {
        commit('someMutation')
        resolve()
      }, 1000)
    })
  }
}

以下代码在一个组件的方法中派发actionA()动作函数:

this.$store.dispatch('actionA').then(() => {
  // 当actionA()动作函数中的异步操作执行完毕后,再执行then()函数指定的操作
  ……
})

在仓库的一个动作函数中还可以派发另一个动作函数:

actions: {
  //……
  actionB ({ dispatch, commit }) {  //actionB()函数派发actionA()函数
    return dispatch('actionA').then(() => {
      commit('someOtherMutation')
    })
  }
}

此外,还可以通过async/await来执行异步操作,例如

//假定getData()和getOtherData()返回Promise对象
actions: {
  async actionA ({ commit }) {  //async表明当前函数包含异步操作
    commit('gotData', await getData())
  },
  async actionB ({ dispatch, commit }) {
    await dispatch('actionA') //等待actionA()的异步操作执行完毕
    commit('gotOtherData', await getOtherData())
  }
}

1.异步动作范例

以下位于src/main.js中的代码创建了一个包含actions选项的仓库store,包括addQuantityAction()和calculateAction()动作函数:

const store = createStore({
  state () {
    return {
      item: {
        name: '苹果',
        price: 3.8,
        quantity: 1,
        total :  3.8
      }
    }
  },

  mutations: {
    addQuantity(state){  //增加购买数量
      state.item.quantity++
    },
    calculate(state){  //计算总价格
     state.item.total=state.item.price * state.item.quantity
    }
  },

  actions: {
    addQuantityAction({commit}){
      return new Promise((resolve)=>{
        setTimeout(          //模拟异步操作
          ()=>{
             commit('addQuantity')
             resolve()
          },2000)
      })
    },

    calculateAction({commit,dispatch}){
      //等购买数量增加后,再计算总价格
      dispatch('addQuantityAction').then( ()=>{
        commit('calculate')
      })
    }
  }
})

以上代码中的动作函数的作用如下:
(1)addQuantityAction()动作函数:包含异步操作,过2秒后提交addQuantity()更新函数。
(2)calculateAction()动作函数:会派发addQuantityAction()动作函数,等到addQuantityAction()动作函数的异步操作执行完毕以后,再执行then()函数,从而提交calculate()更新函数。
例程1的AsyncJudge.vue定义了AsyncJudge组件,它的calculate()方法会向仓库派发calculateAction()动作函数。

例程1 AsyncJudge.vue

<template>
  <div>
    <p>商品名字: {{item.name}}  </p>
    <p>单价: {{item.price}}  </p>
    <p>数量: {{item.quantity}}  
    <button @click="calculate">增加</button>  </p>
    <p>总价:{{item.total}}</p>
  </div>
</template>
  
<script>
  import { mapState,mapActions } from 'vuex'

  export default {
    computed: mapState(['item']),
  
    methods: {
      ...mapActions({calculate: 'calculateAction'})  
    }
  }
</script>

在src/router/index.js中,为AsyncJudge组件设置的路由的路径为“judge”。通过浏览器访问“http://localhost:8080/#/judge”,会出现如图1所示的网页。在网页上点击“增加”按钮,就会看到在延迟2秒后,{{item.quantity}}以及{{item.total}}的取值会发生相应的更新。
在这里插入图片描述

图1 AsyncJudge组件的页面

2. 使用async/await的范例

以下位于src/main.js中的代码创建了一个包含actions选项的仓库store,包括一个loadCustomerAction()动作函数,该动作函数用async来标识,表明是包含异步操作的函数:

const store = createStore({
  state () {
    return {
      customer: '',
      msg: ''
    }
  },

  mutations: {
    clearCustomer(state){
      state.msg='正在查询...'
      state.customer=''
    },
    loadCustomer(state,response){
      if(response.data !== null){
        state.customer=response.data
        state.msg=''
      }else
        state.msg='未找到匹配的数据!'    
    }
  },

  actions: {
    async loadCustomerAction({commit},id){
      commit('clearCustomer')  
      const response=await axios({
         baseURL: 'http://www.javathinker.net',
         url: '/customer',
         method: 'get',
         params: {id: id}
      })
      commit('loadCustomer',response)
    }
  }
})

loadCustomerAction()动作函数会通过Axios请求访问服务器,查询与id匹配的customer对象。在异步调用axios()函数之前,会提交clearCustomer()更新函数,等到Axios的异步请求执行完毕,再提交loadCustomer()更新函数。

例程2的AsyncCustomer.vue定义了AsyncCustomer组件。它的getCustomer()方法会向仓库派发loadCustomerAction()动作函数。

例程2 AsyncCustomer.vue

<template>
  <div>
    <p>输入id: <input v-model="id" />  
           <button @click="getCustomer">查询</button>  {{msg}}
    </p>  
    <p>{{customer}}</p>
  </div>
</template>
  
<script>
  import {mapState} from 'vuex'
  export default {
    data(){ return {id: '' }},
    computed: mapState(['customer','msg']),
    methods: {
      getCustomer(){
        this.$store.dispatch('loadCustomerAction',this.id).then(
          ()=>{console.log(this.customer)}
        )
      }
    }
  }
</script>

在src/router/index.js中,为AsyncCustomer组件设置的路由的路径为“cust”。通过浏览器访问“http: //localhost:8080/#/cust”,会出现如图2所示的网页。在网页上的id输入框输入1,再点击“查询”按钮,会看到网页先显示“正在查询…”,延迟一段时间后,再显示id为1的customer对象的信息。
在这里插入图片描述

图2 AsyncCustomer组件的页面

相关文章:

  • Java设计模式之策略模式
  • 【HMS core】【FAQ】音频编辑服务、推送服务、AR Engine典型问题合集
  • Android毕业论文选题基于Uniapp+Springboot实现的智能患者服药提醒APP处方药方
  • 详解Mysql中日期比较大小的方法
  • Java性能优化:Stream如何提高遍历集合效率?
  • SSM岭师旧书回收系统毕业设计-附源码041921
  • Java开发中常用的框架有哪些?
  • 如何快速在线扫描文档?Web TWAIN SDK 教你轻松解决
  • JSONredis
  • 与5G一起过中秋,天涯变咫尺
  • 进入docker容器命令行
  • java实战项目视频,2022年大厂Java高级面试题分享
  • Jira - create project
  • 档案管理学名词解释全集
  • 【比特熊故事汇2.0】|即使每天都是新的探险,他也会快乐Say Hi
  • [PHP内核探索]PHP中的哈希表
  • 2018以太坊智能合约编程语言solidity的最佳IDEs
  • avalon2.2的VM生成过程
  • Javascript 原型链
  • KMP算法及优化
  • Lsb图片隐写
  • SAP云平台里Global Account和Sub Account的关系
  • SpriteKit 技巧之添加背景图片
  • 前言-如何学习区块链
  • 日剧·日综资源集合(建议收藏)
  • 推荐一款sublime text 3 支持JSX和es201x 代码格式化的插件
  • 小李飞刀:SQL题目刷起来!
  • AI又要和人类“对打”,Deepmind宣布《星战Ⅱ》即将开始 ...
  • ​力扣解法汇总946-验证栈序列
  • ​如何防止网络攻击?
  • ​软考-高级-系统架构设计师教程(清华第2版)【第9章 软件可靠性基础知识(P320~344)-思维导图】​
  • ​香农与信息论三大定律
  • #define 用法
  • $.proxy和$.extend
  • (java)关于Thread的挂起和恢复
  • (NSDate) 时间 (time )比较
  • (ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY)讲解
  • (二)linux使用docker容器运行mysql
  • (附源码)springboot社区居家养老互助服务管理平台 毕业设计 062027
  • (附源码)ssm本科教学合格评估管理系统 毕业设计 180916
  • (附源码)计算机毕业设计高校学生选课系统
  • (论文阅读26/100)Weakly-supervised learning with convolutional neural networks
  • (全注解开发)学习Spring-MVC的第三天
  • (算法设计与分析)第一章算法概述-习题
  • (转)mysql使用Navicat 导出和导入数据库
  • .NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划
  • .Net的DataSet直接与SQL2005交互
  • .pop ----remove 删除
  • /run/containerd/containerd.sock connect: connection refused
  • /usr/bin/python: can't decompress data; zlib not available 的异常处理
  • @column注解_MyBatis注解开发 -MyBatis(15)
  • []AT 指令 收发短信和GPRS上网 SIM508/548
  • [100天算法】-二叉树剪枝(day 48)
  • [8-27]正则表达式、扩展表达式以及相关实战
  • [AHOI2009]中国象棋 DP,递推,组合数