前言


单页面应用大多采用前后端分离开发思路,我们知道,前端和后端交互有多中方式(服务器端渲染、Ajax、websocket等),今天我们主要讲解Ajax部分。

最近团队讨论了一下,Ajax 本身跟 Vue 并没有什么需要特别整合的地方,使用 fetch polyfill 或是 axios、superagent 等等都可以起到同等的效果,vue-resource 提供的价值和其维护成本相比并不划算,所以决定在不久以后取消对 vue-resource 的官方推荐。已有的用户可以继续使用,但以后不再把 vue-resource 作为官方的 ajax 方案。
-- 摘自vuefe.github.io

vue更新至2.0之后,官方推荐的Ajax插件库是axios,而不再是vue-resource,理由如上。

axios快速使用


如何安装请移步axios,文档描述的很清楚。

常见用法

其实我们用的最多的就是get、post请求。

Performing a GET request

// get
axios.get('/user', {
params: {
ID: 12345
}
})
.then(function (response) {
console.log(response);
})
.catch(function (error) {
console.log(error);
});

Performing a POST request

axios.post('/user' , {
params: {
firstName: 'Fred',
lastName: 'Flintstone'
}
})
.then(function (response) {
console.log(response);
})
.catch(function (error) {
console.log(error);
});

掌握了以上两种最基本的用法,我们已经可以去进行开发了。

示例demo

演示了如何使用axios请求cnode社区的API。
请点击这里

axios的封装


上一步已经实现用axios请求网络资源,那为什么要封装axios呢?

以下几点原因:

  • 配置通用项
  • 统一处理请求错误,进行提示

完整源码

请点击这里

请求流程

请求完整流程

请求失败

通常请求失败有两种原因:

  • 网络异常/服务器宕机
  • 后端抛出错误

每个后端在请求失败时返回的数据结构大同小异,前后端可以商量好,我的后台返回给我的请求失败接口如下:

{
"status": 1,
"msg": "购物车为空",
"success": false
}

如果只是普通用法,如下所示:

axios.post('/user' , {
params: {
firstName: 'Fred',
lastName: 'Flintstone'
}
})
.then(function (response) {
// 处理响应
// 其中存在后端返回的错误
})
.catch(function (error) {
// 网络异常引发的错误
});

我们知道,一般中大型规模的项目,请求是比较多的,这样导致代码冗余,会越来越臃肿,我们可以对错误进行预处理。

拦截器

在普通用法中,then()处理响应,catch()处理错误,通过拦截器,可以提前判断,并返回二者之一。

这里并没有在拦截器中对错误进行处理,而是将响应或者错误返回到get/post请求的结果中,通过链式处理。

// 请求时的拦截
axios.interceptors.request.use(function (config) {
// 发送请求之前做一些处理
return config;
}, function (error) {
// 当请求异常时做一些处理
return Promise.reject(error);
}); // 响应时拦截
axios.interceptors.response.use(function (response) {
// 返回响应时做一些处理
return response;
}, function (error) {
// 当响应异常时做一些处理
return Promise.reject(error);
});

封装get,post方法

封装的get/post方法由3部分组成:

 
链式处理
  • 基本配置
    包括请求方法,基础url,相对url,参数,超时时间,请求头等。
  • checkStatus()
    链式处理第一步,判断http状态码是否正常,和拦截器一样,请求正常则返回响应,请求异常则返回错误,最后返回结果给checkCode()。
  • checkCode()
    链式处理第二步,处理上一步的结果,分别处理网络异常,以及后端返回的异常。

在组件中引用

注: 使用babel-preset-stage-3才可保证async和await正常使用。

引入封装后的axios

import http from '../utils/http'
import api from '../utils/api'

使用方法

fetchData: async function () {
let params = {
}
const res = await http.get(api.right, params)
if (res.data.success) {
alert('请求成功')
}
}

参考

非原创,在以下文章基础上修改而成。
vue中统一处理ajax错误

https://www.jianshu.com/p/3ab216fa185c

【转】Vue 2.0封装axios笔记的更多相关文章

  1. Vue 2.0的学习笔记:Vue的过滤器

    转自: https://www.w3cplus.com/vue/how-to-create-filters-in-vuejs.html 过滤器的介绍 1.在Vue中使用过滤器(Filters)来渲染数 ...

  2. vue中局部封装axios

    Vue中局部配置axios 'use strict' import axios from 'axios'; import { Loading } from 'element-ui'; export c ...

  3. 创建Vue项目及封装axios

    1. 始vue化项目 https://www.cnblogs.com/xiaonq/p/11027880.html vue init webpack deaxios # 使用脚手架创建项目 deaxi ...

  4. vue cli3.0配制axios代理

    今天学习时,想访问网易新闻接口,结果显而易见,因为跨域被浏览器拒绝了. 去网上找一下结果一开始找到的是2.x版本的配置,生硬的放进去,给我各种报错.编译阶段就炸了.浪费好多时间 再按3.0版本去搜索才 ...

  5. Vue.js2.0快速入门笔记

    vue.js 解耦视图与数据,可复用的组件,前端路由,状态管理,虚拟DOM. MVVM模式:当View(视图层)变化时,会自动更新ViewModel(视图模型),View与ViewModel之间双向绑 ...

  6. vue cli3.0 封装组件全局引入js文件并发布到npm

    首先用 vue create创建一个项目 当前的项目目录是这样的: 首先需要创建一个 packages 目录,用来存放组件 然后将 src 目录改为 examples 用作示例 二.修改配置 启动项目 ...

  7. Vue笔记:封装 axios 为插件使用

    前言 自从Vue2.0推荐大家使用 axios 开始,axios 被越来越多的人所了解.使用axios发起一个请求对大家来说是比较简单的事情,但是axios没有进行封装复用,项目越来越大,引起的代码冗 ...

  8. Vue: axios 请求封装及设置默认域名前缀 (for Vue 2.0)

    1. 实现效果 以get方法向http://192.168.32.12:8080/users 发起请求.获取数据并进行处理 this.apiGet('/users', {}) .then((res) ...

  9. vue2.0 如何自定义组件(vue组件的封装)

    一.前言 之前的博客聊过 vue2.0和react的技术选型:聊过vue的axios封装和vuex使用.今天简单聊聊 vue 组件的封装. vue 的ui框架现在是很多的,但是鉴于移动设备的复杂性,兼 ...

随机推荐

  1. Intellij idea 添加浏览器

    最近的项目要做一个海康的网页端的监控,需要下载海康的插件,但是试验了一下,Chrome和IE的都不支持插件的显示,只有搜狗的显示,但是Idea的默认浏览器里面没有,所以要添加一个默认的浏览器 方法很简 ...

  2. 《深入理解JVM虚拟机》读书笔记

    前言:<深入理解JVM虚拟机>是JAVA的经典著作之一,因为内容更偏向底层,所以之前一直没有好好的阅读过.最近因为刚好有空,又有了新目标.所以打算和<构架师的12项修炼>一起看 ...

  3. 小程序scss页面布局

    html <view class="main"> <form bindsubmit="feedback"> <textarea c ...

  4. Gradle实现编译差异

    今天开发组长问了这么一个问题,如何实现通过gradle编译动态设置代码里的一些值.可能这么说不太明白,下面说依稀具体需求. 开发中有两个服务器:一个用于测试版本.一个用于线上版本发布,这两个服务器地址 ...

  5. python模块(3)

    1.xml:实现不同语言或程序之间进行数据交换的协议 <data> <country name="Liechtenstein"> <rank upda ...

  6. 用C#二次封装虹软arcface

    相信很多用C#又想用虹软的SDK的童鞋要花很多心思去研究怎么转换,所以写了一篇文章和一个demo方便用C#的童鞋方便调用虹软的接口,文章的地址是:https://blog.xgcos.com/show ...

  7. 学习笔记26— roc曲线(python)

    一.概念: 准确率(Accuracy), 精确率(Precision), 召回率(Recall)和F1-Measure 机器学习(ML), 自然语言处理(NLP), 信息检索(IR)等领域, 评估(E ...

  8. C++ 实现sqilte创建数据库插入、更新、查询、删除

    C/C++ Interface APIs Following are important C/C++ SQLite interface routines, which can suffice your ...

  9. Codeforces 1053 C - Putting Boxes Together

    C - Putting Boxes Together 思路: 求带权中位数 用树状数组维护修改 代码: #pragma GCC optimize(2) #pragma GCC optimize(3) ...

  10. Python中read()、readline()和readlines()三者间的区别和用法

    2019-01-15 10:48:43 前言 众所周知在python中读取文件常用的三种方法:read(),readline(),readlines(),今天看项目是又忘记他们的区别了.以前看书的时候 ...