封装axios,避免loading闪烁,vue3,vant

文章介绍了在Vue应用中,如何利用axios的拦截器结合vant的loading组件,以及防抖函数来优化请求显示。通过统计loading请求次数和使用函数防抖,确保loading不会频繁闪烁,并在所有相关请求完成后才关闭。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

连续多次请求,loading防止闪烁,避免loading连续关闭开启

方法:数量统计,函数防抖,二次判断

import axios, { type AxiosRequestConfig, type AxiosResponse } from 'axios';
import { nextTick } from 'vue';
import {
  showLoadingToast,
} from 'vant';

import { useDebounceFn } from '@vueuse/core';

let loadingReqCount = 0; // 统计loading个数
let loadingInstance: any; // 正在loading的实例

function showLoading() {
  if (loadingReqCount === 0 && !loadingInstance) {
    loadingInstance = showLoadingToast({
      message: '加载中...',
      forbidClick: true, // 不可点击关闭
      duration: 0, // 无限随间
    });
  }
  loadingReqCount++;
}

function closeLoading() {
  loadingReqCount--;
  loadingReqCount = Math.max(loadingReqCount, 0); // 保证大于等于0
  if (loadingReqCount === 0 || loadingInstance) {
    hideLoading();
  }
}

// 关闭loading防抖,延迟300ms执行,合并该时延内的间断请求。
const hideLoading = useDebounceFn(() => {
  // loadingReqCount 需要二次判断,因为后续接口调用会增加这个值,就不能直接关闭
  if (loadingReqCount === 0) {
    loadingInstance.close();
    loadingInstance = null;
  }
}, 300);

// 请求拦截器
service.interceptors.request.use(
  (config: AxiosRequestConfig) => {
    showLoading();
    ****
  },
  error => {
    closeLoading();
    ****
  },
);

// 响应拦截器
service.interceptors.response.use(
  (response: AxiosResponse) => {
    ****
    closeLoading();
    ****
  },
  error => {
   ****
    closeLoading();
    ****
  },
);

// 导出 axios 实例
export default service;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值