VUE 全局设置防重复点击

请求后端防止重复点击,用户点击加入遮罩层,请求完毕关闭遮罩层

我们利用请求拦截器,在用户点击的时候,弹出遮罩层
本文采用i18n国际化 + element plus UI,提取你想要的,这里不做简化

完整代码如下:

// src/service/httpService.js

import axios from 'axios';
import {
    ElMessage, ElLoading } from 'element-plus';
import i18n from '../i18n';

const apiEndpoint = process.env.VUE_APP_API_ENDPOINT;

const httpClient = axios.create({
   
    baseURL: apiEndpoint + '/api',
});

let loadingInstance;

// 请求拦截器
httpClient.interceptors.request.use(config => {
   
    loadingInstance = ElLoading.service({
    fullscreen: true, text: 'Loading...' });
    const token = localStorage.getItem('token') || sessionStorage.getItem('token');
    if (token) {
   
        config.headers['Authorization'] = `Bearer ${
     token}`;
    }
    return config;
}, error => {
   
    if (loadingInstance) loadingInstance.close();
    return Promise.reject(error);
});

httpClient.interceptors.response.use(
    response => {
   
       if (loadingInstance) loadingInstance.close();
       return response;
    }, error => {
   
        if (loadingInstance) loadingInstance.close();

        let message = '';
        let messageType = 'error'; // 默认消息类型

        if (error.response) {
   
            const status = error.response.status;
            message = error.response.data.message || i18n.global.t('defaultErrorMessage');

            if (status < 200) {
   
                messageType = 'info';
            } else if (status >= 300 && status < 400) {
   
                messageType = 'warning';
            } else if (status >= 400 && status < 500) {
   
                messageType = 'warning';
            } else if (status >= 500) {
   
                messageType = 'error';
            }
        } else if (error.request) {
   
            message = i18n.global.t('noResponse');
            messageType = 'error';
        } else {
   
            message = i18n.global.t('requestError');
            messageType = 'error';
        }

        ElMessage({
   showClose: true, message: message, type: messageType, duration: 5000,});
        return Promise.reject(error);
    }
);

export const get = async (url, params = {
    }) => {
   
    const response = await httpClient.get(url, {
    params });
    return response.data;
};

export const post = async (url, data) => {
   
    const response = await httpClient.post(url, data);
    return response.data;
};

export default {
   
    get,
    post,
};

相关推荐

  1. VUE 全局设置重复

    2024-02-07 07:28:02       28 阅读
  2. 接口抖(重复

    2024-02-07 07:28:02       12 阅读
  3. VUE按钮下载全部链接文件

    2024-02-07 07:28:02       30 阅读
  4. vue设置自身以外其他区域关闭列表

    2024-02-07 07:28:02       7 阅读
  5. CSS实现

    2024-02-07 07:28:02       23 阅读
  6. 后端防止重复

    2024-02-07 07:28:02       32 阅读
  7. kafka 消息丢失/消息重复设计分析

    2024-02-07 07:28:02       20 阅读
  8. 【CSS节流】实现防止按钮重复

    2024-02-07 07:28:02       42 阅读
  9. uni-app多次触发事件,防止重复

    2024-02-07 07:28:02       26 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-02-07 07:28:02       19 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-02-07 07:28:02       20 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-02-07 07:28:02       20 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-02-07 07:28:02       20 阅读

热门阅读

  1. c# 命令行帮助类

    2024-02-07 07:28:02       24 阅读
  2. 【机器学习】Ubuntu系统下显卡驱动卸载及重装

    2024-02-07 07:28:02       37 阅读
  3. opencv案例实战:条码区域分割

    2024-02-07 07:28:02       35 阅读
  4. C++哈希表map映射

    2024-02-07 07:28:02       36 阅读
  5. Vue组件通信的方式

    2024-02-07 07:28:02       29 阅读
  6. 【trie 字典树】( RAII | Multiset频次统计 | STL )

    2024-02-07 07:28:02       30 阅读
  7. k8s etcd备份与恢复

    2024-02-07 07:28:02       28 阅读
  8. R语言入门笔记2.2

    2024-02-07 07:28:02       28 阅读
  9. 【Scala】 2. 函数

    2024-02-07 07:28:02       32 阅读