ajax二次封装配合防抖处理,vue,axios,elementUI(改)

32 篇文章 2 订阅
30 篇文章 0 订阅

纯属个人记录,代码很糙,因为博客之前发布过一次,这次是修订之后的。已经比较全面的解决了我目前所遇到的痛点。

项目痛点:

1、每次接口调用完成都需要处理错误提示和操作成功提示。

2、页面蒙版并不能解决用户点击提交的时候重复提交请求

解决:

1、ajax继承页面蒙版控制

2、错误和成功信息既可以全局处理也可以自定义

3、ajax代码集成防抖函数

4、默认数据过滤处理,当字符串中出现NaN,undefined,null则过滤,数据为空过滤,注意长度为零的数组不过滤

项目环境:vue,axios,elementUI

ajax防抖缺陷:

防抖处理缺陷:
 当两个函数同时需要防抖的时候另一个函数也会受到防抖的影响,所以请避免同时需要防抖。如需要,额外处理第二个防抖函数。
import Vue from "vue";
import axios from "axios";
import VueAxios from "vue-axios";

import { Notification, Loading } from "element-ui";

// axios全局导入设置
Vue.use(VueAxios, axios);

//自定义函数信息
let custom = {
  //成功信息提示
  sucIfno(info) {
    Notification({
      type: "success",
      message: info
    });
  },
  //错误信息提示
  errIfno(info) {
    Notification({
      type: "error",
      message: info
    });
  }
};
//过滤空数据包含NaN,undefined,null
const filterNull = json => {
  let newJson = {};
  let reg = RegExp(/NaN|undefined|null/);
  for (let li in json) {
    if (json[li] && !reg.test(json[li])) {
      newJson[li] = json[li];
    }
  }
  return newJson;
};
const ajax = o => {
  o.loading = o.loading || false; //是否出现全局加载提示,支持传入字符串
  o.data = o.data || {};
  o.filterNull = o.filterNull !== false;
  o.headers = o.headers || {
    "Content-Type": "application/json;charset=UTF-8"
  };

  //成功提示信息,传入true则提示默认信息,传入字符串则出现字符串信息
  o.is_suc = o.is_suc || false;
  o.is_suc = o.is_suc === true ? "操作成功" : o.is_suc;
  //错误提示信息,默认不出现,传入true则出现后端接口提示信息,传入字符串则提示字符串信息
  o.is_err = o.is_err || false;
  o.is_err = o.is_err === true ? "网络异常" : o.is_err;

  //空数据过滤
  o.data = o.filterNull === true ? filterNull(o.data) : o.data;

  const method = o.method;
  let loadingInstance = "";
  if (o.loading) {
    loadingInstance = Loading.service({
      lock: true,
      text: o.loading !== true ? o.loading : "努力加载中……",
      spinner: "el-icon-loading",
      background: "rgba(0, 0, 0, 0.7)"
    });
  }
  return new Promise((suc, err) => {
    axios({
      url: o.url,
      [method === "post" ? "data" : "params"]: o.data,
      headers: o.headers,
      method: method || "get"
    })
      .then(t => {
        if (o.loading) {
          loadingInstance.close();
        }
        let req = t.data;
        if (req && req.code === 0) {
          //正确提示信息
          o.is_suc !== false && custom.sucIfno(o.is_suc);
          suc(req);
        } else {
          //错误信息提示
          if (o.is_err !== false) {
            o.is_err !== "网络异常"
              ? custom.errIfno(o.is_err)
              : custom.errIfno(req.msg ? req.msg : "网络异常");
          }
          err(req);
        }
      })
      .catch(e => {
        if (o.loading) {
          loadingInstance.close();
        }
        //错误信息提示
        o.is_err !== false ? custom.errIfno("网络异常") : false;
        err(e);
      });
  });
};
/*防抖处理缺陷:
 当两个函数同时需要防抖的时候另一个函数也会受到防抖的影响,所以请避免同时需要防抖。如需要,额外处理第二个防抖函数。
 * */
let timeOut = null;
axios.ajax = opt => {
  //是否防抖
  let isAntiShake = opt.isAntiShake || false;
  let shakeTime = opt.shakeTime || 500; //默认防抖时间半秒
  if (!isAntiShake) {
    //不进行防抖处理
    return new Promise((suc, err) => {
      ajax(opt)
        .then(e => {
          suc(e);
        })
        .catch(e => {
          err(e);
        });
    });
  } else {
    //进行防抖处理
    return new Promise((suc, err) => {
      timeOut && clearTimeout(timeOut);
      let callNow = !timeOut;
      if (callNow) {
        ajax(opt)
          .then(e => {
            suc(e);
          })
          .catch(e => {
            err(e);
          });
      }
      timeOut = setTimeout(
        () => {
          timeOut = null;
        }, //见注解
        shakeTime
      );
    });
  }
};

export default axios;

最后:防抖内容请看我之前的博客 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue 是一个前端框架,而 axios 是一个基于 Promise 的 HTTP 请求库。在 Vue 项目中,我们通常需要使用 axios 来进行接口请求。由于每个项目的接口返回数据结构和请求方式可能不同,因此我们需要对 axios 进行二次封装以方便统一管理。 二次封装可以解决以下问题: 1. 统一处理请求错误,例如网络错误、接口返回的错误码等。 2. 统一处理请求 loading 状态,避免每个请求都需要手动设置 loading 状态。 3. 统一处理请求头和请求参数等信息,避免每个请求都需要手动设置。 以下是一个简单的 vue axios 二次封装的示例: ``` // api.js import axios from 'axios' import { Message } from 'element-ui' const service = axios.create({ baseURL: process.env.VUE_APP_BASE_API, timeout: 5000 // 请求超时时间 }) // 请求拦截器 service.interceptors.request.use( config => { // 在这里可以统一设置请求头等信息 return config }, error => { // 请求错误时的处理 return Promise.reject(error) } ) // 响应拦截器 service.interceptors.response.use( response => { const res = response.data // 在这里可以统一处理接口返回的错误码等信息 if (res.code !== 0) { Message({ message: res.message || 'Error', type: 'error', duration: 5 * 1000 }) return Promise.reject(new Error(res.message || 'Error')) } else { return res } }, error => { // 响应错误时的处理 return Promise.reject(error) } ) export default service ``` 上述代码中,我们通过 axios.create 创建了一个 axios 实例,并对其进行了配置。在请求拦截器中,我们可以统一设置请求头等信息。在响应拦截器中,我们可以统一处理接口返回的错误码等信息,并使用 element-ui 中的 Message 组件来显示错误信息。 使用示例: ``` import request from '@/utils/api' request({ url: '/user/info', method: 'get', params: { id: 123 } }).then(response => { console.log(response) }).catch(error => { console.log(error) }) ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值