详解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 相关文章推荐
表头固定(利用jquery实现原理介绍)
Nov 08 Javascript
javascript重写alert方法的实例代码
Mar 29 Javascript
浅谈jQuery中对象遍历.eq().first().last().slice()方法
Nov 26 Javascript
js获取当前时间显示在页面上并每秒刷新
Dec 24 Javascript
JavaScript实现添加及删除事件的方法小结
Aug 04 Javascript
精通JavaScript的this关键字
May 28 Javascript
手机浏览器 后退按钮强制刷新页面方法总结
Oct 09 Javascript
微信小程序中显示html格式内容的方法
Apr 25 Javascript
jQuery实现的淡入淡出图片轮播效果示例
Aug 29 jQuery
基于Vue实现可以拖拽的树形表格实例详解
Oct 18 Javascript
vue动态添加路由addRoutes之不能将动态路由存入缓存的解决
Feb 19 Javascript
jQuery实现tab栏切换效果
Dec 22 jQuery
浅谈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学习之 认清变量的作用范围
2010/01/26 PHP
php调用mysql数据 dbclass类
2011/05/07 PHP
php 归并排序 数组交集
2011/05/10 PHP
php输出图像的方法实例分析
2017/02/16 PHP
laravel5.1框架model类查询的实现方法
2019/10/08 PHP
js 判断checkbox是否选中的实现代码
2010/11/23 Javascript
分别用marquee和div+js实现首尾相连循环滚动效果,仅3行代码
2011/09/21 Javascript
什么是json和jsonp,jQuery json实例详详细说明
2012/12/11 Javascript
创建js对象和js类的方法汇总
2014/12/24 Javascript
jQuery实现拖动调整表格单元格大小的代码实例
2015/01/13 Javascript
jquery调整表格行tr上下顺序实例讲解
2016/01/09 Javascript
快速掌握Node.js模块封装及使用
2016/03/21 Javascript
jquery常用的12个小功能
2016/07/22 Javascript
Vue底层实现原理总结
2018/02/17 Javascript
微信小程序实现长按删除图片的示例
2018/05/18 Javascript
详解微信小程序调用支付接口支付
2019/04/28 Javascript
vue store之状态管理模式的详细介绍
2019/06/13 Javascript
Vue.js项目实战之多语种网站的功能实现(租车)
2019/08/07 Javascript
在VUE style中使用data中的变量的方法
2020/06/19 Javascript
Bootstrap告警框(alert)实现弹出效果和短暂显示后上浮消失的示例代码
2020/08/27 Javascript
解决ant design vue中树形控件defaultExpandAll设置无效的问题
2020/10/26 Javascript
jQuery-App输入框实现实时搜索
2020/11/19 jQuery
python连接mysql调用存储过程示例
2014/03/05 Python
python实现监控linux性能及进程消耗性能的方法
2014/07/25 Python
编写Python爬虫抓取豆瓣电影TOP100及用户头像的方法
2016/01/20 Python
Ubuntu+python将nii图像保存成png格式
2019/07/18 Python
python3.x提取中文的正则表达式示例代码
2019/07/23 Python
Python3+SQLAlchemy+Sqlite3实现ORM教程
2021/02/16 Python
开水果连锁店创业计划书
2013/12/29 职场文书
读书活动总结
2014/04/28 职场文书
水利水电建筑施工应届生求职信
2014/07/04 职场文书
求职信的正确写法
2014/07/10 职场文书
安全保卫工作竞聘材料
2014/08/25 职场文书
幼儿园老师新年寄语
2015/08/17 职场文书
七年级生物教学反思
2016/02/20 职场文书
嵌入式Redis服务器在Spring Boot测试中的使用教程
2021/07/21 Redis