Vue异步请求最佳实践
一、当前存在的问题
目前项目前端请求后台数据的方式是这样的:
页面中
method中dispatch到actionaction调用mutation,请求axios请求到数据后存储到
state中页面中在
computed中获取state,使用watch监听到数据变化之后做业务逻辑。
调用流程如图:

在当前的项目中,这样的调用方式可以解决异步请求,对于接口的响应速度也很快。但依然有着几点不足。
1.代码冗余
页面中的每一个请求都需要一个method,一个comuputed和一个watch。我们知道computed是计算属性,是Vue数据驱动的重要实现。但在计算属性里获取state这个操作并没有去"计算"。实际上是用了mapstate获取了全局的state,计算属性在这里成了一个state的容器。
2.业务逻辑依赖watch
我们知道watch是监听器,但是用监听器去监听计算属性(数据驱动的)的变化,是本末倒置了。可以看看Vue官方文档是如何描述监听的:
虽然计算属性在大多数情况下更合适,但有时也需要一个自定义的侦听器。这就是为什么 Vue 通过 watch 选项提供了一个更通用的方法,来响应数据的变化。当需要在数据变化时执行异步或开销较大的操作时,这个方式是最有用的。
watch应该是作为computed的补充,而不是代替。所以当前的问题是大量的业务逻辑写在watch里,而不是在调用接口,数据返回之后立即处理
3.错误的mutation使用
为什么是错误的呢?我们先看看为什么会有上面两个错误的出现。当我们把axios写到mutation的时候,我们发现computed获取到state的数据不是同步的。

二、解决问题
我们理想的情况是希望页面调用method之后去请求axios,后端数据返回时立即进行业务处理,处理完成之后界面立刻响应渲染。另外请求出错的时候,我们也希望能有对应的处理。实现上述需求,需要使用Promise来解决。了解Promise的用法,可以参考这篇文章Promise使用详解。
使用Promise之后的请求流程变为下图:

在当前的请求逻辑下,我们可能觉得很疑惑的一点是,为什么删除的时候需要使用state?按照Vue的定义,state应该是一个公共的变量,所以删除之后的数据我不需要保存到state,但是为了保持页面的响应我们只能使用state来保存,使用computed去获取state,使用watch去响应数据变化。这样的步骤明显是多余的,那么我们看看使用了Promise之后的代码是什么样的,这里以一个删除功能为例:
首先我们需要在action中写一个Promise,在Promise中调用axios。理论上我们可以在页面上直接调用axios,但是由于需要保持API接口与页面解耦,所以页面的method方法依然是调用action。
actions:{
/* 删除资源action,进行了HTTP请求状态的判断,页面请求该方法后需要进行处理*/
async delResBaseInfo(context, id) {
return new Promise(function(resolve, reject) {
axios
.delete(`${api}/${id}`)
.then((response) => {
if (response.status == 200) {
resolve(Immutable.fromJS(response.data));
} else {
reject(Immutable.fromJS(response.data));
}
})
.catch(function(error) {
console.log(error);
});
});
}
}
页面method的调用函数,里面包含了业务逻辑。
// 删除数据,调用action的axios请求
deletData(id) {
this.loading = true;
this.$store
.dispatch('resourceBase/delResBaseInfo', id)
.then((response) => {
if (response.get('code') == 1) {
this.getData();
this.loading = false;
successMessage(this, textStandard.deleteSuccess(''));
} else {
errorMessage(this, textStandard.deleteError(''));
}
})
.catch((error) => {
console.log(error);
});
},
使用了Promise之后的代码得到了简化,并且因为Promise的特性,异步问题也能完美解决。
Vue异步请求最佳实践的更多相关文章
- vue 异步请求
摘自 ECMAScript 6 简介: 大家习惯将 ECMAScript 6.0 简称为 ES6,它是 Javascript 语言的下一代标准,它的目标,是使得 Javascript 语言可以用来编写 ...
- vue.js+boostrap最佳实践
一.为什么要写这篇文章 最近忙里偷闲学了一下vue.js,同时也复习了一下boostrap,发现这两种东西如果同时运用到一起,可以发挥很强大的作用,boostrap优雅的样式和丰富的组件使得页面开发变 ...
- Vue 小项目的最佳实践
项目简介 目前一期只是为App内某个模块资讯模块文章的分享和APP下载,后续还会有更多的功能,为了项目可扩展.可伸缩结合了我以前的实践搭建了此项目项目地址,如果这个简单的项目能给您带来帮助请给小哥哥⭐ ...
- vue项目缓存最佳实践
需求 在开发vue的项目中有遇到了这样一个需求:一个视频列表页面,展示视频名称和是否收藏,点击进去某一项观看,可以收藏或者取消收藏,返回的时候需要记住列表页面的页码等状态,同时这条视频的收藏状态也需要 ...
- vue 异步请求数据后,用v-if,显示组件,这样初始化的值就在开始的时候传进去了
请求到数据才会有的一个组件,并把数据传进组件中 https://www.cnblogs.com/LuckyWinty/p/6246698.html
- Vue 工程化最佳实践
目录结构 总览 api 目录用于存放 api 请求,文件名与模型名称基本一致,文件名使用小驼峰,方法名称与后端 restful 控制器一致. enums 目录存放 常量,与后端的常量目录对应 ...
- uni-app 中实现 onLaunch 异步回调后执行 onLoad 最佳实践
前言 好久没写博客了,由于公司业务需要,最近接触uiapp比较多,一直想着输出一些相关的文章.正好最近时间富余,有机会来一波输出了. 问题描述 在使用 uni-app 开发项目时,会遇到需要在 onL ...
- vue(6)—— vue中向后端异步请求
异步请求 其实什么是异步请求已经不用多说了,通俗的说,就是整个页面不会刷新,需要更新的部分数据做局部刷新,其他数据不变. 学到这里,你应该用过jquery里的ajax了,所以很能理解了,不多说了.详细 ...
- vue处理异步请求
vue 处理异步请求 项目中需要 先调一个接口去取到人员编号,再去调另一个借口,人员编号作为参数才能去请求数据 用setTimeout 其实也可以,先new了一个promise对象 ,把请求放在里面, ...
随机推荐
- Android 中更新 UI 的四种方式
runOnUiThread handler 的 post handler 的 sendMessage View 自身的 post
- Dalvik VM和JVM的比较
为什么不是jvm 而要搞一个dalvik vm ? jvm 在设计上考虑的时pc机 dalvik在设计上针对手机,特点:1. 速度快 2. 功耗低 (在移动设备上)
- 反射中的 Method 的 getReadMethod 与 getWriteMethod 使用 【获取一个对象的所有属性字段名称和其对应的值】
转: class反射(一),以及Method 的 getReadMethod 与 getWriteMethod 使用 2018年11月28日 17:27:42 zich77521 阅读数 788 ...
- maven项目无法导入Oracle的jdbc连接jar包【我】
导入一个maven项目,启动一直报错 找不到Oracle的jdbc连接驱动Class, 用Eclipse导入 ojdbc14.jar 连接包,各种方法都无效,无法引入到部署后的lib目录中,可以直接放 ...
- CSS3动画相关属性详解
本文转载于:<https://blog.csdn.net/lyznice/article/details/54575905> 一.2D效果属性 要使用这些属性,我们需要通过 transfo ...
- php进程创建慢导致的502
转自: 作者:jackxiang@向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除地址:http://www.jackxiang.com/post/926 ...
- xss 学习(一)
存储型 .反射型.DOM 型这是最常见的三种分类: 存储型存储型XSS也叫持久型XSS,存储的意思就是Payload是有经过存储的,当一个页面存在存储型XSS的时候,XSS注入成功后,那么每次访问该页 ...
- Email功能的设定
在前期制定发送邮件功能时,都是使用导入import smtplib模块来实现,虽说能实现, 但是对新人.刚接触的来说不太友好,虽然网上五花八门的教程一大推,但还是要自己花不少时间才搞定(笔者就是) 在 ...
- Python 中__new__()和__init__()的区别
转自: https://blog.csdn.net/weixin_37579123/article/details/89515577 __new__方法:类级别的方法 特性: 1.是在类准备将自身实例 ...
- XSS练习平台- https://alf.nu/alert1
https://alf.nu/alert1 参考:https://www.cnblogs.com/renzongxian/p/5617551.html 我目前的进度:https://alf.n ...