当前位置:首页 > 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 拦截器:

vue axios实现loading

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 效果,根据项目需求选择适合的方案即可。拦截器方式能统一管理所有请求的加载状态,避免重复代码。

标签: vueaxios
分享给朋友:

相关文章

vue实现效果

vue实现效果

以下是Vue实现常见效果的几种典型方法,分为不同场景说明: 数据绑定与响应式更新 使用v-model实现表单双向绑定: <template> <input v-model="…

vue 动画 实现

vue 动画 实现

vue 动画实现方法 Vue 提供了多种方式实现动画效果,主要包括过渡动画和动态动画两类。 使用 <transition> 组件实现基础过渡 通过 Vue 内置的 <transit…

vue实现定位

vue实现定位

Vue 中实现定位的方法 在 Vue 中实现定位可以通过以下几种方式: 使用 CSS 定位 通过 CSS 的 position 属性实现定位,Vue 中可以直接在组件的 <style>…

vue实现动画

vue实现动画

Vue 实现动画的方法 Vue 提供了多种方式来实现动画效果,包括内置的过渡系统、第三方动画库以及直接操作 CSS 或 JavaScript 动画。 使用 Vue 内置过渡系统 Vue 的 <…

vue 实现赋值

vue 实现赋值

Vue 实现赋值的方法 在 Vue 中,赋值操作通常涉及数据绑定和响应式更新。以下是几种常见的赋值方式: 直接赋值给 data 属性 在 Vue 实例的 data 对象中定义的属性可以直接通过 th…

vue实现模糊

vue实现模糊

Vue实现模糊搜索的方法 在Vue中实现模糊搜索功能通常需要结合输入框和列表渲染,通过监听输入内容动态过滤数据。以下是几种常见实现方式: 使用计算属性实现 计算属性适合处理需要响应式更新的搜索逻辑:…