当前位置:   article > 正文

vue-cli中怎么基于axios去封装方法

怎么去封装axios

大家好,我是minijie,潜水于掘金和思否的一名前端小小生,今天看了几篇文章关于vue中怎么去封装axios,视乎好多版本都是基于promise去做的。这让我很疑惑,axios不就是基于promise的一个请求库吗?为啥还要多一层promise呢?

下面是根据我自己的想法去基于axios+ansyc去封装一个自己用的请求库,有疑惑的可以在下方留言讨论

 1、首先通过npm去下载axios(我推荐使用cnpm,比较是国内快一点)

npm install axios复制代码

2、在vue-cli中 src目录中创建一个叫api的文件夹(当然名字自己喜欢就可以了,取上面看自己),并在api文件中创建一个叫https.js文件

目录结果如图


3、在https.js文件中写代码:

首先导入aixos和vue模块  可以去官axios方先看看文档 ✈✈ 飞机

  1. import axios from 'axios'
  2. import Vue from 'vue'复制代码

环境的选择

  1. var BaseUrl = ""; //请求的地址因为我是用node代理测试环境已经配好了
  2. if (process.env.NODE_ENV == 'development') {
  3. //开发用的
  4. BaseUrl = '';
  5. }
  6. else if (process.env.NODE_ENV == 'debug') {
  7. // 调试用的
  8. BaseUrl = '';
  9. }
  10. else if (process.env.NODE_ENV == 'production') {
  11. // 线上环境
  12. BaseUrl = 'https://echarts.baidu.com/examples/';
  13. }复制代码

写一个基础请求我这里命名为requestFN

  1. function requestFN(o) {
  2. //基础请求方法
  3. //o.type //请求类型
  4. //o.url //请求路径
  5. var obj = {
  6. method: o.type, //请求的类型
  7. url: BaseUrl + o.url //请求地址
  8. }
  9. if (o.hasOwnProperty("params")) {
  10. obj.params = o.params; //url后面带参数 如 https://echarts.baidu.com/examples/a?test="1"
  11. } else if (o.hasOwnProperty("data")) {
  12. obj.data = o.data; // data 带参数
  13. }
  14. 这里做好多事情比如说有没有携带token cookie这类没用肯定要dosoming的啦,
  15. 根据你的业务需要自己加吧,我这里就不写了,如有疑问可以留言我
  16. //返回axios的基础方法
  17. return axios(obj).then(r => {
  18. return r.data; //方法请求的数据
  19. })}复制代码

定义一个GET请求方法 我这里采用的是async

  1. async function getFN(o) {
  2. //get方法
  3. var result = await requestFN(o);
  4. return result;
  5. }复制代码

定义一个POST方法也是如此

  1. async function postFN(o) {
  2. //get方法
  3. var result = await requestFN(o);
  4. return result;
  5. }复制代码

设置一下超时时间

axios.defaults.timeout = 10000;复制代码

最后我们把它写在vue的原型上面,并暴露出去

  1. const install = () => {
  2. Vue.prototype.getFN = getFN; //GET方法
  3. Vue.prototype.postFN = postFN; //POST方法
  4. }
  5. export default install;复制代码

当然很多时候我们会处理一些异常的状态码,比如说后端大哥说没有token我这边会给你一个40103的状态码,你自己去做处理,这个时候我们就要用到响应拦截器喽

  1. axios.interceptors.response.use(
  2. response => {
  3. //成功请求的状态码
  4. //注意状态码是根据后端返回给我的,要自己根据业务需求去写我这里只是做实例
  5. if (response.status == 200) {
  6. return Promise.resolve(response);
  7. } else {
  8. return Promise.reject(response);
  9. }
  10. },
  11. error => {
  12. //失败请求的状态码
  13. if (error.response) {
  14. switch (error.response.status) {
  15. case 40103:
  16. router.replace({ path: '/login' });
  17. localStorage.removeItem("tokenValue");
  18. break;
  19. }
  20. return Promise.reject(error.response.data)
  21. }
  22. });复制代码

这样我们就完成一个axios的请求封装

另外我们还需要将这个文件代入到main.js里面

mian.js文件:

  1. import https from './api/https';地址根据你实际情况引入
  2. Vue.use(https); 复制代码

我们看效果

先看看vue的原型上有没有我们这两个方法



有了这个我们就可以用this.getFN 或this.postFN去根据业务去请求数据了

我这里展示我的结果

代码:


结果:



美滋滋,希望对大家有所帮助

最后提供node代理配置,用于解决跨域

找到config---index.js文件


代码:

  1. const host = "https://echarts.baidu.com/examples/";
  2. // Paths
  3. assetsSubDirectory: 'static',
  4. assetsPublicPath: '/',
  5. proxyTable: {
  6. '/': { target: host + '',
  7. changeOrigin: true,
  8. pathRewrite: {
  9. '^/': ''
  10. }
  11. }
  12. },复制代码

谢谢

转载请留下地址,禁止商业转载

 有问题可以反馈给我   qq:652165177

GitHub地址:点我


                       ====未完待续====


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/285532
推荐阅读
相关标签
  

闽ICP备14008679号