详解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 相关文章推荐
[转]JS宝典学习笔记
Feb 07 Javascript
IE6与IE7中,innerHTML获取param的区别
Mar 15 Javascript
jquery批量控制form禁用的代码
Aug 06 Javascript
Js制作简单弹出层DIV在页面居中 中间显示遮罩的具体方法
Aug 08 Javascript
通过JQuery将DIV的滚动条滚动到指定的位置方便自动定位
May 05 Javascript
深入探究JavaScript中for循环的效率问题及相关优化
Mar 13 Javascript
vue.js select下拉框绑定和取值方法
Mar 03 Javascript
Vue框架里使用Swiper的方法示例
Sep 20 Javascript
JS实现将对象转化为数组的方法分析
Jan 21 Javascript
JS实现移动端在线签协议功能
Aug 22 Javascript
vue使用recorder.js实现录音功能
Nov 22 Javascript
原生JS实现无缝轮播图片
Jun 24 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上传文件常见问题总结
2015/02/03 PHP
两款万能的php分页类
2015/11/12 PHP
PHP读取zip文件的方法示例
2016/11/17 PHP
jquery JSON的解析方式
2009/07/25 Javascript
深入理解Javascript闭包 新手版
2010/12/28 Javascript
基于jquery跨浏览器显示的file上传控件
2011/10/24 Javascript
Jquery上传插件 uploadify v3.1使用说明
2012/06/18 Javascript
获取元素距离浏览器周边的位置的方法getBoundingClientRect
2013/04/17 Javascript
jquery.ajax之beforeSend方法使用介绍
2014/12/08 Javascript
JavaScript限定图片显示大小的方法
2015/03/11 Javascript
Javascript使用function创建类的两种方法(推荐)
2016/11/19 Javascript
canvas实现简易的圆环进度条效果
2017/02/28 Javascript
JS对象的深度克隆方法示例
2017/03/16 Javascript
JS中showModalDialog关闭子窗口刷新主窗口用法详解
2017/03/25 Javascript
常见的浏览器Hack技巧整理
2017/06/29 Javascript
Node.js使用Express.Router的方法
2017/11/14 Javascript
vue代理和跨域问题的解决
2018/07/18 Javascript
Vue实现商品详情页的评价列表功能
2019/09/04 Javascript
浅谈vue中$bus的使用和涉及到的问题
2020/07/28 Javascript
解决removeEventListener 无法清除监听的问题
2020/10/30 Javascript
JavaScript中clientWidth,offsetWidth,scrollWidth的区别
2021/01/25 Javascript
详解ES6实现类的私有变量的几种写法
2021/02/10 Javascript
分析并输出Python代码依赖的库的实现代码
2015/08/09 Python
Python中random模块生成随机数详解
2016/03/10 Python
Python实现Youku视频批量下载功能
2017/03/14 Python
对python opencv 添加文字 cv2.putText 的各参数介绍
2018/12/05 Python
解决Pycharm调用Turtle时 窗口一闪而过的问题
2019/02/16 Python
numpy.random模块用法总结
2019/05/27 Python
python实现车牌识别的示例代码
2019/08/05 Python
基于python分析你的上网行为 看看你平时上网都在干嘛
2019/08/13 Python
CSS3图片旋转特效(360/60/-360度)
2013/10/10 HTML / CSS
Spartoo荷兰:鞋子、包包和服装
2018/07/12 全球购物
小露珠教学反思
2014/04/30 职场文书
长城英文导游词
2015/01/30 职场文书
探究Mysql模糊查询是否区分大小写
2021/06/11 MySQL
在 HTML 页面中使用 React的场景分析
2022/01/18 Javascript