详解Vue前端对axios的封装和使用


Posted in Javascript onApril 01, 2019

Axios 是一个基于 promise 的 HTTP 库。将axios封装好后能更高效的开发并且方便维护,而且在以后的项目中也能直接套用,所以封装好是必要的。在参考了很多方法后,我拼凑出了一套我认为很实用的方法。

首先是http目录下的两个文件

helper.js

这个是功能性文件包括拼接url、过滤参数等,把方法集合到一个文件方便维护和修改。
读一遍知道他有什么功能就行了

const helper = {
 // 根据name获取地址栏的参数值
 getQueryString (name) {
  let reg = new RegExp(`(^|&)${name}=([^&]*)(&|$)`)
  let hash = window.location.hash
  let search = hash.split('?')
  let r = search[1] && search[1].match(reg)
  if (r != null) return r[2]; return ''
 },
 // 拼接参数至url
 queryString (url, query) {
  let str = []
  for (let key in query) {
   str.push(key + '=' + query[key])
  }
  let paramStr = str.join('&')
  return paramStr ? `${url}?${paramStr}` : url
 },
 
// 自定义判断元素类型JS
 toType(obj) {
	 return ({}).toString.call(obj).match(/\s([a-zA-Z]+)/)[1].toLowerCase()
	},
// 参数过滤函数
 filterNull(o) {
	 for (var key in o) {
	  if (o[key] === null) {
	   delete o[key]
	  }
	  if (toType(o[key]) === 'string') {
	   o[key] = o[key].trim()
	  } else if (toType(o[key]) === 'object') {
	   o[key] = filterNull(o[key])
	  } else if (toType(o[key]) === 'array') {
	   o[key] = filterNull(o[key])
	  } else if (toType(o[key]) === 'number') {
	   o[key] = filterNull(o[key])
	  }
	 }
	 return o
	}

}
export default helper

http.js

接收请求,暴露接口,包含参数params、发往后端的url和token(如果不用JWT的同学可以省略参数token),处理后发往后端

import axios from 'axios'
let qs = require('querystring')
import helper from './helper'

//console.log( process.env.NODE_ENV)
//判断环境提供baseURL,注意要与后台地址一致
let root = process.env.NODE_ENV === 'development'
 // 开发环境api接口
 ?
 `http://localhost:3001/api`
 // 生产环境api接口
 :
 `http://127.0.0.1:3001/api`;
// 引用axios,设置头文件
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';


function apiAxios(method, url, params, token) {
 if (params) {
  params = helper.filterNull(params)
 }
 return axios({
  method: method,
  //拼接参数
  url: method === 'GET'|| method === 'DELETE' ? helper.queryString(url,params) : url,
  data: method === 'POST' || method === 'PUT' ? qs.stringify(params) : null,
  baseURL: root,
  timeout: 10000,
  headers: { Authorization: `Bearer ${token}` },	//jwt
  withCredentials: false
 })
}

// 返回在vue模板中的调用接口
export default {
 get: function (url, params, token) {
  return apiAxios('GET', url, params, token)
 },
 post: function (url, params, token) {
  return apiAxios('POST', url, params, token)
 },
 put: function (url, params, token) {
  return apiAxios('PUT', url, params, token)
 },
 delete: function (url, params, token) {
  return apiAxios('DELETE', url, params, token)
 },
}

api.js

封装前端api接口,接受前端页面发来的请求,封装后可根据函数名判断类型和url给axios文件,方便维护和开发。

import http from '../http/http.js'
export default {
 login(data, token){
  return http.post("/login",data, token)
 },
 getUserInfo(data, token){
  return http.get("/getUserInfo",data, token)
 }
}

在main.js中引用后就可以全局调用了

前端中用this.$api.urlName()的格式发送请求,也可以不经过api直接用this. $http,但是每次都要写url,当接口多的时候比较麻烦。所以推荐用api封装好。

import api from './api/api.js'
import http from './http/http.js'
//定义全局变量
Vue.prototype.$api = api

Vue.prototype.$http = http

前端中使用:

由于axios返回的是promise对象,所以要用 .then的形式接收后端发回来的response,然后做出相应的反馈。

//直接用this.$api调用api中接口,如果不封装api接口可以用this.$http
 this.$api.login(data, token).then((res) => {
	console.log(res)
 }).catch((err) => {
 	console.log(res)
 })

以上所述是小编给大家介绍的Vue前端对axios的封装和使用详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
jqTransform form表单美化插件使用方法
Jul 05 Javascript
浅析JavaScript中的类型和对象
Nov 29 Javascript
原生js实现秒表计时器功能
Feb 16 Javascript
深入理解在JS中通过四种设置事件处理程序的方法
Mar 02 Javascript
Node.js通过身份证号验证年龄、出生日期与性别方法示例
Mar 09 Javascript
详解如何使用PM2将Node.js的集群变得更加容易
Nov 15 Javascript
浅谈使用React.setState需要注意的三点
Dec 18 Javascript
Egg.js 中 AJax 上传文件获取参数的方法
Oct 10 Javascript
js canvas画布实现高斯模糊效果
Nov 27 Javascript
js实现无缝轮播图特效
May 09 Javascript
js+css实现全屏侧边栏
Jun 16 Javascript
js数组中去除重复值的几种方法
Aug 03 Javascript
浅谈js闭包理解
Apr 01 #Javascript
详解Vue之父子组件传值
Apr 01 #Javascript
微信二次分享报错invalid signature问题及解决方法
Apr 01 #Javascript
JS中的防抖与节流及作用详解
Apr 01 #Javascript
微信小程序 slot踩坑的解决
Apr 01 #Javascript
浅谈Vue.js 关于页面加载完成后执行一个方法的问题
Apr 01 #Javascript
VUE脚手架的下载和配置步骤详解
Apr 01 #Javascript
You might like
php中禁止单个IP与ip段访问的代码小结
2012/07/04 PHP
配置php网页显示各种语法错误
2013/09/23 PHP
PHP基本语法总结
2014/09/06 PHP
Zend Framework教程之Zend_Config_Xml用法分析
2016/03/23 PHP
php快速排序原理与实现方法分析
2016/05/26 PHP
Laravel框架路由和控制器的绑定操作方法
2018/06/12 PHP
javascript与CSS复习(《精通javascript》)
2010/06/29 Javascript
动态加载外部javascript文件的函数代码分享
2011/07/28 Javascript
JavaScript 类型的包装对象(Typed Wrappers)
2011/10/27 Javascript
jQuery中unwrap()方法用法实例
2015/01/16 Javascript
原生JS和JQuery动态添加、删除表格行的方法
2015/05/28 Javascript
bootstrap jquery dataTable 异步ajax刷新表格数据的实现方法
2017/02/10 Javascript
NodeJs下的测试框架Mocha的简单介绍
2017/02/22 NodeJs
Node.js+ES6+dropload.js实现移动端下拉加载实例
2017/06/01 Javascript
分享19个JavaScript 有用的简写写法
2017/07/07 Javascript
在React中如何优雅的处理事件响应详解
2017/07/24 Javascript
原生JS写Ajax的请求函数功能
2017/12/22 Javascript
vue 中swiper的使用教程
2018/05/22 Javascript
Angular之jwt令牌身份验证的实现
2020/02/14 Javascript
Vue如何实现监听组件原生事件
2020/07/03 Javascript
[03:09]2014DOTA2国际邀请赛 Mushi前队友送上祝福
2014/07/12 DOTA
[00:47]DOTA2荣耀之路6:天火,天火!
2018/05/30 DOTA
TF-IDF与余弦相似性的应用(二) 找出相似文章
2017/12/21 Python
python 对dataframe下面的值进行大规模赋值方法
2018/06/09 Python
基于Python实现用户管理系统
2019/02/26 Python
pyqt5、qtdesigner安装和环境设置教程
2019/09/25 Python
Python求平面内点到直线距离的实现
2020/01/19 Python
Python的pygame安装教程详解
2020/02/10 Python
浅谈three.js中的needsUpdate的应用
2012/11/12 HTML / CSS
澳大利亚在线购买儿童玩具:Toy Universe
2017/12/28 全球购物
Trina Turk官网:美国时装和泳装品牌
2018/06/10 全球购物
美国家居装饰店:Pier 1
2019/09/04 全球购物
自荐书4要点
2014/01/25 职场文书
安全生产大检查方案
2014/05/07 职场文书
《你在为谁工作》心得体会(共8篇)
2016/01/20 职场文书
2019年二手房买卖合同范本
2019/10/14 职场文书