当前位置:首页 > VUE

vue axios实现loading

2026-01-18 14:31:53VUE

Vue 中使用 Axios 实现 Loading 效果

在 Vue 项目中,可以通过 Axios 拦截器全局管理请求的 Loading 状态,结合 UI 组件(如 Element UI、Ant Design Vue 等)实现加载提示。

安装 Axios 和 UI 组件库

npm install axios
npm install element-ui  # 以 Element UI 为例

创建全局 Loading 控制逻辑

src/utils/request.js 中配置 Axios 拦截器:

import axios from 'axios';
import { Loading } from 'element-ui';

let loadingInstance = null;

const service = axios.create({
  baseURL: process.env.VUE_APP_BASE_API,
  timeout: 10000
});

// 请求拦截器
service.interceptors.request.use(
  config => {
    loadingInstance = Loading.service({
      lock: true,
      text: '加载中...',
      spinner: 'el-icon-loading',
      background: 'rgba(0, 0, 0, 0.7)'
    });
    return config;
  },
  error => {
    loadingInstance.close();
    return Promise.reject(error);
  }
);

// 响应拦截器
service.interceptors.response.use(
  response => {
    loadingInstance.close();
    return response.data;
  },
  error => {
    loadingInstance.close();
    return Promise.reject(error);
  }
);

export default service;

在组件中使用封装后的 Axios

import request from '@/utils/request';

export default {
  methods: {
    fetchData() {
      request.get('/api/data').then(res => {
        console.log(res);
      }).catch(err => {
        console.error(err);
      });
    }
  }
}

自定义 Loading 组件(可选)

如果不依赖 UI 库,可通过 Vue 状态管理实现:

// store.js
import Vue from 'vue';
import Vuex from 'vuex';

Vue.use(Vuex);

export default new Vuex.Store({
  state: {
    loading: false
  },
  mutations: {
    SET_LOADING(state, status) {
      state.loading = status;
    }
  }
});

// request.js
import store from './store';

service.interceptors.request.use(config => {
  store.commit('SET_LOADING', true);
  return config;
});

service.interceptors.response.use(
  response => {
    store.commit('SET_LOADING', false);
    return response;
  },
  error => {
    store.commit('SET_LOADING', false);
    return Promise.reject(error);
  }
);

模板中绑定 Loading 状态

<template>
  <div>
    <div v-if="$store.state.loading" class="custom-loading">
      数据加载中...
    </div>
    <button @click="fetchData">获取数据</button>
  </div>
</template>

样式优化

.custom-loading {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background: rgba(0, 0, 0, 0.5);
  display: flex;
  justify-content: center;
  align-items: center;
  color: white;
  z-index: 9999;
}

通过以上方法可以实现全局请求的 Loading 效果,根据项目需求选择适合的方案即可。拦截器方式能统一管理所有请求的加载状态,避免重复代码。

vue axios实现loading

标签: vueaxios
分享给朋友:

相关文章

vue实现活动倒计时

vue实现活动倒计时

实现活动倒计时的基本思路 在Vue中实现活动倒计时通常需要获取当前时间与活动结束时间的差值,并将其转换为天、小时、分钟、秒的格式展示。通过定时器每秒更新显示的时间。 定义倒计时数据 在Vue组件的d…

vue实现a

vue实现a

Vue 实现 A 功能的方法 在 Vue 中实现 A 功能可以通过多种方式,具体取决于 A 功能的具体需求。以下是几种常见的实现方法: 使用 Vue 组件 通过创建自定义组件来实现 A 功能。组件…

eventbus vue实现

eventbus vue实现

EventBus 实现原理 EventBus 是一种发布/订阅模式,用于 Vue 组件间的通信。核心是通过一个中央事件总线管理事件监听和触发。 创建 EventBus 在 Vue 项目中创建一个独立…

vue实现点击

vue实现点击

实现点击事件的基本方法 在Vue中实现点击事件可以通过v-on指令或@简写方式绑定。以下是常见的点击事件绑定方法: <template> <button v-on:click=…

vue 实现jqslidedown

vue 实现jqslidedown

在 Vue 中实现类似 jQuery 的 slideDown 效果,可以通过 Vue 的过渡系统或 CSS 动画结合动态样式绑定来实现。以下是几种实现方式: 使用 Vue Transition 组件…

vue实现tablegrid

vue实现tablegrid

Vue 实现 TableGrid 的方法 使用 Element UI 的 Table 组件 Element UI 提供了强大的 Table 组件,可以快速实现表格布局。安装 Element UI 后,…