详解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执行顺序
Nov 09 Javascript
JS解析XML实例分析
Jan 30 Javascript
JavaScript使用concat连接数组的方法
Apr 06 Javascript
javascript实现动态表头及表列的展现方法
Jul 14 Javascript
js实现改进的仿蓝色论坛导航菜单效果代码
Sep 06 Javascript
如何在Linux上安装Node.js
Apr 01 Javascript
js HTML5多图片上传及预览实例解析(不含前端的文件分割)
Aug 26 Javascript
JavaScript 判断对象中是否有某属性的常用方法
Jun 14 Javascript
详解离线安装npm包的几种方法
Nov 25 Javascript
selenium+java中用js来完成日期的修改
Oct 31 Javascript
js实现带搜索功能的下拉框
Jan 11 Javascript
解决vant的Toast组件时提示not defined的问题
Nov 11 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 更新数据库中断的解决方法
2009/06/05 PHP
PHP基于Closure类创建匿名函数的方法详解
2017/08/17 PHP
PHP下 Mongodb 连接远程数据库的实例代码
2017/08/30 PHP
php实现文章评论系统
2019/02/18 PHP
php提供实现反射的方法和实例代码
2019/09/17 PHP
javascript 原型模式实现OOP的再研究
2009/04/09 Javascript
使用JavaScript实现Java的List功能(实例讲解)
2013/11/07 Javascript
JavaScript获取文本框内选中文本的方法
2015/02/20 Javascript
js插件dropload上拉下滑加载数据实例解析
2016/07/27 Javascript
微信小程序canvas写字板效果及实例
2017/06/15 Javascript
如何使用JS在HTML中自定义字符串格式化
2017/07/20 Javascript
JS+CSS3实现的简易钟表效果示例
2019/04/13 Javascript
Angular Excel 导入与导出的实现代码
2019/04/17 Javascript
vue实现滑动切换效果(仅在手机模式下可用)
2020/06/29 Javascript
区分vue-router的hash和history模式
2020/10/03 Javascript
Echarts在Taro微信小程序开发中的踩坑记录
2020/11/09 Javascript
js实现简单的轮播图效果
2020/12/13 Javascript
天翼开放平台免费短信验证码接口使用实例
2013/12/18 Python
Python的randrange()方法使用教程
2015/05/15 Python
Python中tell()方法的使用详解
2015/05/24 Python
Python模拟登陆淘宝并统计淘宝消费情况的代码实例分享
2016/07/04 Python
Python面向对象class类属性及子类用法分析
2018/02/02 Python
python买卖股票的最佳时机(基于贪心/蛮力算法)
2019/07/05 Python
浅析PyTorch中nn.Module的使用
2019/08/18 Python
python中怎么表示空值
2020/06/19 Python
Python的logging模块基本用法
2020/12/24 Python
全方位了解CSS3的Regions扩展
2015/08/07 HTML / CSS
李维斯德国官方网上商店:Levi’s德国
2016/09/10 全球购物
nohup的用法
2014/08/10 面试题
董事长岗位职责
2013/11/30 职场文书
教师绩效考核方案
2014/01/21 职场文书
2015初中政治教学工作总结
2015/07/21 职场文书
利用ajax+php实现商品价格计算
2021/03/31 PHP
Java工作中实用的代码优化技巧分享
2022/04/21 Java/Android
Java由浅入深通关抽象类与接口(下篇)
2022/04/26 Java/Android
MySQL 数据 data 基本操作
2022/05/04 MySQL