当前位置:首页 > VUE

vue axios实现loading

2026-01-18 14:31:53VUE

Vue 中使用 Axios 实现 Loading 效果

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

vue axios实现loading

安装 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) 使用组件库(如Element UI) Element UI提供了现成的验证码组件,可直接集成到Vue项目中。 安装Element UI: npm install elemen…

项目基于vue实现

项目基于vue实现

基于Vue实现项目的关键方法 搭建基础环境 安装Node.js和npm/yarn,确保开发环境具备运行Vue的能力。通过Vue CLI快速初始化项目结构,选择所需配置(如Babel、Router、Vu…

vue中如何实现循环

vue中如何实现循环

在 Vue 中实现循环 Vue 提供了 v-for 指令用于实现循环渲染列表数据。v-for 可以遍历数组、对象或数字范围,生成动态的 DOM 元素。 遍历数组 使用 v-for 遍历数组时,语法为…

vue实现走势图

vue实现走势图

Vue 实现走势图的方法 使用 ECharts 库 ECharts 是一个强大的数据可视化库,支持多种图表类型,包括走势图(折线图)。在 Vue 项目中可以通过 vue-echarts 封装库或直接使…

vue实现多选题

vue实现多选题

Vue实现多选题的方法 使用Vue实现多选题功能,可以通过v-model绑定数组、动态渲染选项、以及处理选中状态来实现。以下是一个完整的实现示例: 基础实现代码 <template>…

vue实现a4打印模板

vue实现a4打印模板

使用Vue实现A4打印模板 在Vue中实现A4打印模板需要结合CSS的打印样式和Vue的模板渲染能力。以下是具体实现方法: 设置A4纸张尺寸 在CSS中定义A4纸张的标准尺寸(210mm × 29…