axios在vue中的简单封装及应用
1、axios是什么?
ajax封装的是浏览器提供的xmlhttprequest,axios封装的是浏览器提供的fetch,fetch是为了应对其他需求所对于xmlhttprequest的再一次封装。一句话,axios走在了封装界的最前沿,而且大家对它的评价都相当不错,vue一开始是要搞一个自己的封装,但是到2.0是推荐的就是axios了。那它应该就是不错,毕竟我们需要学习的是vue全家桶。
2、axios的特性
这个粘贴一下官网自己的说法啊就行,没有一一验证,毕竟我的需求ajax也能满足,不过没办法,谁让它火呢。
从浏览器中创建 XMLHttpRequests 从 node.js 创建 http 请求 支持 Promise API 拦截请求和响应 转换请求数据和响应数据 取消请求 自动转换 JSON 数据 客户端支持防御 XSRF
3、axios在vue中的使用
1)、在vue项目中安装axios,使用命令 npm install --save axios vue-axios
2)、在vue项目的main.js中引入axios,贴一下代码,记住要在vue对象实例化之后使用。
import Vue from 'vue' import axios from 'axios' import VueAxios from 'vue-axios' Vue.use(VueAxios, axios)
3)、在vue项目中使用axios,有三种使用方式,粘贴代码看下
Vue.axios.get(api).then((response) => { console.log(response.data) }) this.axios.get(api).then((response) => { console.log(response.data) }) this.$http.get(api).then((response) => { console.log(response.data) })
4、axios在vue中封装一下
首先将axios请求封装,建立一个AxiosPack.js
import Vue from 'vue' import axios from 'axios' import VueAxios from 'vue-axios' import {Message} from 'element-ui' import qs from "qs"; Vue.use(VueAxios, axios) //消息提示 const tip = (errorStr)=>{ Message.error({message: errorStr}); } /** * 跳转登录页 * 携带当前页面路由,以期在登录页面完成登录后返回当前页面 */ const toLogin = () => { router.replace({ path: '/', query: { redirect: router.currentRoute.fullPath } }); } //请求失败后的错误统一处理 const errorHandle = (status, other) => { switch (status) { case 403: tip('登录过期,请重新登录'); // 清除token // localStorage.removeItem('token'); // store.commit('loginSuccess', null); setTimeout(() => { toLogin(); }, 1000); break; case 404: tip('网络请求不存在'); break; default: tip(other); } } // 请求拦截器 axios.interceptors.request.use( config => { // 在发送请求之前做些什么(后期在这里加上token) // const token = store.state.token; // token && (config.headers.Authorization = token); return config; }, error => { // 对请求错误做些什么 return Promise.reject(error); } ) // 响应拦截器 axios.interceptors.response.use( // 请求成功 (res) => { if(res.status === 200) { return Promise.resolve(res.data); } else { return Promise.reject(res); } }, // 请求失败 error => { if (error && error.response) { switch (error.response.status) { case 400: tip('请求错误(400)'); break; case 401: tip('未授权,请重新登录(401)'); break; case 403: tip('登录过期,请重新登录'); setTimeout(() => { toLogin(); }, 1000); break; case 404: tip('请求出错(404)'); break; case 408: tip('请求超时(408)'); break; case 500: tip('服务器错误(500)'); break; case 501: tip('服务未实现(501)'); break; case 502: tip('网络错误(502)'); break; case 503: tip('服务不可用(503)'); break; case 504: tip('网络超时(504)'); break; case 505: tip('HTTP版本不受支持(505)'); break; default: tip('连接出错'); break; } } else { tip('连接服务器失败!'); } return Promise.resolve(error); } ) export default { $get(url, data, completedFunc) { let http = axios.get(url, { params: data }); if (completedFunc) { http.then(completedFunc); } else { return http; } }, $postJson(url, data, completedFunc) { let _qsData = JSON.stringify(data); let http = axios.post(url, _qsData, { headers: { "Content-Type": "application/json; charset=utf-8" } }); if (completedFunc) { http.then(completedFunc); } else { return http; } }, $post(url, data, completedFunc) { let _qsData = qs.stringify(data, { arrayFormat: "indices" }); let http = axios.post(url, _qsData); if (completedFunc) { http.then(completedFunc); } else { return http; } }, $postFile(url, form) { let config = { headers: { "Content-Type": "multipart/form-data" } }; let http = axios.post(url, form, config); return http; }, $getFile(url, form) { let config = { headers: { "content-disposition": "attachment; filename=total.xls", "content-type": "application/x-download;charset=utf-8" } }; let _qsData = qs.stringify(form, { arrayFormat: "indices" }); let http = axios.post(url, _qsData, { responseType: "blob", }); return http; } };
然后通过调用上面封装的axios请求,封装业务请求路径,建立Services.js
import AxiosPack from "@/scripts/AxiosPack.js"; const baseUrl = "http://123.123.123.123:8080/xxx_api"; const snailFisUrls = { Dictionarys: { GetDicList:"get /Dictionarys/GetDicList", }, }; const { $get, $postJson, $post, $getFile, $postFile } = AxiosPack; let allAxios = {}; function convertUrls(urls, key) { allAxios[key] = {}; const sUrl = urls[key]; for (const uKey in urls) { if (urls.hasOwnProperty(uKey)) { allAxios[key][uKey] = function (args) { let __urlSplits = urls[uKey].split(" "); if (__urlSplits.length >= 2) { switch (__urlSplits[0]) { case "get": return $get(baseUrl + __urlSplits[1], args); case "getFile": return $getFile(baseUrl + __urlSplits[1], args); case "postFile": return $postFile(baseUrl + __urlSplits[1], args); case "postUrl": return $post(baseUrl + __urlSplits[1] + args); case "postJson": return $postJson(baseUrl + __urlSplits[1], args); default: return $post(baseUrl + urls[uKey], args); } } else { return $post(baseUrl + urls[uKey], args); } }; } } } for (const key in snailFisUrls) { convertUrls(snailFisUrls[key], key); } export default allAxios;
然后封装全局属性,建立PrototypePack.js
import allAxios from "@/scripts/Services.js"; export default { initMixins(Vue) { Vue.prototype.$allAxios = allAxios; } };
最后将全局属性引用到main.js中调用
import PrototypePack from "@/scripts/PrototypePack.js" PrototypePack.initMixins(Vue); new Vue({ ... })
上面封装完毕,我们就可以在vue项目中的任何地方调用了
methods:{ Search(){ this.$allAxios.Dictionarys.GetDicList().then((res)=>{console.log(res)}).catch(()=>{}); }, },