详解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调用迅雷下载代码的二种方法
Apr 15 Javascript
js调试工具Console命令详解
Oct 21 Javascript
js 左右悬浮对联广告代码示例
Dec 12 Javascript
2则自己编写的jQuery特效分享
Feb 26 Javascript
js闭包所用的场合以及优缺点分析
Jun 22 Javascript
javascript学习笔记之函数定义
Jun 25 Javascript
JavaScript数据结构与算法之集合(Set)
Jan 29 Javascript
Ubuntu 16.04 64位中搭建Node.js开发环境教程
Oct 19 Javascript
微信小程序 解决swiper不显示图片的方法
Jan 04 Javascript
微信小程序 首页制作简单实例
Apr 07 Javascript
通过vue-router懒加载解决首次加载时资源过多导致的速度缓慢问题
Apr 08 Javascript
vue插件draggable实现拖拽移动图片顺序
Dec 01 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作的文本留言本的例子(六)
2006/10/09 PHP
DISCUZ 论坛管理员密码忘记的解决方法
2009/05/14 PHP
php删除一个路径下的所有文件夹和文件的方法
2018/02/07 PHP
PHP批斗大会之缺失的异常详解
2019/07/09 PHP
jquery pagination插件实现无刷新分页代码
2009/10/13 Javascript
js下关于onmouseout、事件冒泡的问题经验小结
2010/12/09 Javascript
动态加载script文件的两种方法
2013/08/15 Javascript
jquery创建表格(自动增加表格)代码分享
2013/12/25 Javascript
js实现飞入星星特效代码
2014/10/17 Javascript
node.js中的console.dir方法使用说明
2014/12/10 Javascript
使用AngularJS创建单页应用的编程指引
2015/06/19 Javascript
AngularJS利用Controller完成URL跳转
2016/08/09 Javascript
JSP防止网页刷新重复提交数据的几种方法
2016/11/19 Javascript
jQuery密码强度验证控件使用详解
2017/01/05 Javascript
JavaScript运动框架 解决速度正负取整问题(一)
2017/05/17 Javascript
node.js 核心http模块,起一个服务器,返回一个页面的实例
2017/09/11 Javascript
详解用Node.js实现Restful风格webservice
2017/09/29 Javascript
bootstrap paginator分页插件的两种使用方式实例详解
2017/11/14 Javascript
Electron autoUpdater实现Windows安装包自动更新的方法
2018/12/24 Javascript
jQuery实现弹幕特效
2019/11/29 jQuery
vue中对象数组去重的实现
2020/02/06 Javascript
在vue项目实现一个ctrl+f的搜索功能
2020/02/28 Javascript
Python3.6+Django2.0以上 xadmin站点的配置和使用教程图解
2019/06/04 Python
python中pop()函数的语法与实例
2020/12/01 Python
HTML5 placeholder属性详解
2016/06/22 HTML / CSS
HTML5视频播放插件 video.js介绍
2018/09/29 HTML / CSS
伦敦剧院门票:From The Box Office
2018/06/30 全球购物
销售工作岗位职责
2013/12/24 职场文书
表彰先进的通报
2014/01/31 职场文书
乡镇干部先进事迹材料
2014/02/03 职场文书
高三政治教学反思
2014/02/06 职场文书
《飞向蓝天的恐龙》教学反思
2014/04/09 职场文书
启动仪式策划方案
2014/06/14 职场文书
服装设计专业求职信
2014/06/16 职场文书
中文专业求职信
2014/06/20 职场文书
redis 存储对象的方法对比分析
2021/08/02 Redis