【前端】Vue2全家桶案例《看漫画》之五、引入axios
转载请注明出处:http://www.cnblogs.com/shamoyuu/p/vue_vux_app_5.html
项目github地址:https://github.com/shamoyuu/vue-vux-iconan
我们引入vux的toast插件,为了能在任何地方使用toast(不仅仅是在组件中,比如store.js中),我们修改main.js
import Vue from "vue"
import App from "./App"
import router from "./tools/router"
import store from "./tools/store"
import { ToastPlugin } from "vux"
import TestDirective from "./directives/common/TestDirective"
import api from "./tools/api"
import errorHandle from "./tools/errorHandle" Vue.config.productionTip = false; const FastClick = require("fastclick");
FastClick.attach(document.body); Vue.use(ToastPlugin, { type: "text", position: 'bottom', width: "70vw" });
Vue.use(TestDirective);
Vue.use(api);
Vue.use(errorHandle); Vue.prototype.instance = new Vue({
el: ".app",
router: router,
store: store,
template: "<App/>",
components: { App }
});
修改的地方就图中红色的部分,最后一句比较重要,这样我们可以在任何地方引用到vue的实例,从而达到任何地方都使用toast的目的。
只要能获取到Vue对象,就可以通过下面的方式来弹出toast
Vue.prototype.instance.$vux.toast.show("message")
然后我们添加axios
npm install --save-dev axios
然后我们新建一个文件tools/axios.js文件
import axios from "axios"
import Vue from "vue" //设置全局请求为ajax请求
axios.interceptors.request.use((config) => {
config.headers["X-Requested-With"] = "XMLHttpRequest";
return config;
}); //错误处理
axios.interceptors.response.use(
(response) => {
let result = response.data; if (!result) {
result = {
stateCode: 3,
message: "未获取到数据"
}
} //stateCode为0表示正常返回数据,其他情况表示有错误,错误信息由message提供
switch (result.stateCode) {
case 0:
return result.data;
case 1:
//没有登录
break;
case 2:
//其他错误
break;
default:
break;
} let err = new Error(result.message); err.data = result;
err.response = response; throw err;
},
(err) => {
if (err && err.response) {
if (err.response.status == 404) {
err.message = "请求地址不存在";
}
else {
err.message = "网络异常,请稍后重试[" + err.response.status + "]";
}
}
else {
err.message = "网络异常,请稍后重试";
}
Vue.prototype.instance.$vux.toast.show(err.message);
return Promise.reject(err);
}
); export default axios;
这个文件的内容很简单,唯一需要注意的是拦截response请求的那部分,我们约定使用下面的格式
{
"stateCode": 0,
"data": "当stateCode为0时有效,表示正常返回的数据"
"message": "当stateCode不为0时有效,表示错误信息"
}
所以在stateCode==0的时候,我们直接返回了result.data,其他的信息直接丢弃了,因为页面不需要关心。
这里如果正常返回了数据(200状态),那么是否需要弹出message信息由页面决定,而其他非200的异常都会默认弹出toast提示。
然后我们新建一个错误处理的文件tools/errorHandle.js
export default {
install(Vue) {
Vue.prototype.$errorHandle = function (errorData) {
//如果返回200,则弹出message
if (errorData.response && errorData.response.status == 200) {
if (errorData.data && errorData.data.message) {
Vue.prototype.instance.$vux.toast.show(errorData.data.message);
}
}
else {
//如果是非200,其他错误在这里处理
}
}
}
}
然后我们新建一个tools/api.js文件,将axios再封装一下,顺便让它变成全局对象。
import axios from "@/tools/axios"
export default {
install(Vue) {
Vue.prototype.$api = {
get(url, params) {
return axios.get(url, {
params: params
})
},
post(url, params) {
return axios.post(url, params);
}
}
}
}
至此,我们成功地引入了axios,来写个例子,在任意组件添加下面的代码
mounted: function() {
this.$api.get("http://meleong.duapp.com/xxxx/xxxx", {
id: "1"
})
.then(function(data) {
console.info("成功", arguments);
})
.catch(this.$errorHandle);
}
这里对错误的处理并没有放到then的第二个参数上,而是单独写了catch,这样写比较清晰一点。
如果不写这个catch,对状态200且stateCode != 0的错误不会有任何提示(某些情况下可能真的不需要提示)。

这个是状态404的错误提示,不管写不写catch都会弹出来。

这个是状态200,但是stateCode != 0时的错误提示,必须写了.catch(this.$errorHandle)才会触发。
【前端】Vue2全家桶案例《看漫画》之五、引入axios的更多相关文章
- 【前端】Vue2全家桶案例《看漫画》之一、添加四个导航页
转载请注明出处:http://www.cnblogs.com/shamoyuu/p/vue_vux_app_1.html 项目github地址:https://github.com/shamoyuu/ ...
- 【前端】Vue2全家桶案例《看漫画》之番外篇、express上传漫画(可选)
转载请注明出处:http://www.cnblogs.com/shamoyuu/p/vue_vux_app_extra_1.html 项目github地址:https://github.com/sha ...
- 【前端】Vue2全家桶案例《看漫画》之六、图片阅读页
转载请注明出处:http://www.cnblogs.com/shamoyuu/p/vue_vux_app_6.html 项目github地址:https://github.com/shamoyuu/ ...
- 【前端】Vue2全家桶案例《看漫画》之四、漫画页
转载请注明出处:http://www.cnblogs.com/shamoyuu/p/vue_vux_app_4.html 项目github地址:https://github.com/shamoyuu/ ...
- 【前端】Vue2全家桶案例《看漫画》之二、完成首页基本样式
转载请注明出处:http://www.cnblogs.com/shamoyuu/p/vue_vux_app_2.html 项目github地址:https://github.com/shamoyuu/ ...
- 【前端】Vue2全家桶案例《看漫画》之七、webpack插件开发——自动替换服务器API-URL
转载请注明出处:http://www.cnblogs.com/shamoyuu/p/vue_vux_app_7.html 项目github地址:https://github.com/shamoyuu/ ...
- 【前端】Vue2全家桶案例《看漫画》之三、引入vuex
转载请注明出处:http://www.cnblogs.com/shamoyuu/p/vue_vux_app_3.html 项目github地址:https://github.com/shamoyuu/ ...
- Vue2全家桶+Element搭建的PC端在线音乐网站
目录 1,前言 2,已有功能 3,使用 4,目录结构 5,页面效果 登录页 首页 排行榜 歌单列表 歌单详情 歌手列表 歌手详情 MV列表 MV详情 搜索页 播放器 1,前言 项目基于Vue2全家桶及 ...
- Vue2全家桶之一:vue-cli(vue脚手架)超详细教程
本文转载于:https://www.jianshu.com/p/32beaca25c0d 都说Vue2简单上手容易,的确,看了官方文档确实觉得上手很快,除了ES6语法和webpack的配置让你感到 ...
随机推荐
- gd库的安装
gd库简介 主要用途编辑 在网站上GD库通常用来生成缩略图,或者用来对图片加水印,或者用来生成汉字验证码,或者对网站数据生成报表等.在PHP处理图像,可使用GD库,而GD库开始时是支持GIF的,但由于 ...
- 为PHP设置服务器(Apache/Nginx)环境变量
为PHP设置服务器(Apache/Nginx)环境变量 设置环境变量常见的地方为区分开发环境/生产环境,或者定义一些数据库的帐号密码 设置Apache环境变量 指令 设置当前环境变量为DEV SetE ...
- 16_Python闭包
一.什么是闭包 什么是闭包:内函数对外函数非全局变量的引用,并且外函数的返回值是内函数的引用(地址). def wrapper(): name = 'zhangsan' def inner(): na ...
- 史上最全的JFinal源码分析(不间断更新)
打算 开始 写 这么 一个系列,希望 大家 喜欢,学习 本来就是 一个查漏补缺的过程,希望大家能提出建议.本篇 文章 是整个目录的向导,希望 大家 喜欢.本文 将以 包的形式跟大家做向导. Handl ...
- linux下的打包与压缩
linux压缩或解压缩工具有很多,除了已经很少有人使用的compress外,现在常用的还有tar,bzip2,xz 和gziplinux压缩或解压缩工具有很多,除了已经很少有人使用的compress外 ...
- BZOJ 3572: [Hnoi2014]世界树 [虚树 DP 倍增]
传送门 题意: 一棵树,多次询问,给出$m$个点,求有几个点到给定点最近 写了一晚上... 当然要建虚树了,但是怎么$DP$啊 大爷题解传送门 我们先求出到虚树上某个点最近的关键点 然后枚举所有的边$ ...
- BZOJ 1801: [Ahoi2009]chess 中国象棋 [DP 组合计数]
http://www.lydsy.com/JudgeOnline/problem.php?id=1801 在N行M列的棋盘上,放若干个炮可以是0个,使得没有任何一个炮可以攻击另一个炮. 请问有多少种放 ...
- AMDP + XSLX Workbench 报表开发模式
本文介绍了我和同事通过使用AMDP + XSLX Workbench缩短报表开发周期.分离数据查询处理逻辑和前端展示工作的经验.欢迎讨论. 前言 最近接到了一套人力资源报表的开发需求,需要以EXCEL ...
- 基于Citus和ASP.NET Core开发多租户应用
Citus是基于PsotgreSQL的扩展,用于切分PsotgreSQL的数据,非常简单地实现数据“切片(sharp)”.如果不使用Citus,则需要开发者自己实现分布式数据访问层(DDAL),实现路 ...
- python 3.x 爬虫基础---Urllib详解
python 3.x 爬虫基础 python 3.x 爬虫基础---http headers详解 python 3.x 爬虫基础---Urllib详解 前言 爬虫也了解了一段时间了希望在半个月的时间内 ...