当前位置:首页 > VUE

Vue全局loading实现

2026-03-29 22:29:10VUE

Vue 全局 Loading 的实现方法

通过 Vue 指令实现

创建一个自定义指令,用于在元素上显示或隐藏 loading 状态。在指令的钩子函数中,动态添加或移除 loading 元素。

// main.js
import Vue from 'vue'

Vue.directive('loading', {
  bind(el, binding) {
    const loadingDiv = document.createElement('div')
    loadingDiv.className = 'loading-mask'
    loadingDiv.innerHTML = '<div class="loading-spinner"></div>'
    el.loadingElement = loadingDiv

    if (binding.value) {
      el.appendChild(loadingDiv)
    }
  },
  update(el, binding) {
    if (binding.value) {
      el.appendChild(el.loadingElement)
    } else {
      el.removeChild(el.loadingElement)
    }
  }
})

// App.vue
<template>
  <div v-loading="isLoading"></div>
</template>

使用 Vue 插件封装

将 loading 功能封装为 Vue 插件,通过全局方法调用显示和隐藏 loading。

// loading.js
const Loading = {
  install(Vue) {
    Vue.prototype.$loading = {
      show() {
        // 显示 loading 逻辑
      },
      hide() {
        // 隐藏 loading 逻辑
      }
    }
  }
}

// main.js
import Loading from './loading'
Vue.use(Loading)

// 组件中使用
this.$loading.show()
this.$loading.hide()

结合 Vuex 状态管理

使用 Vuex 管理全局 loading 状态,在需要的地方通过 mutations 改变状态。

// store.js
const store = new Vuex.Store({
  state: {
    loading: false
  },
  mutations: {
    setLoading(state, payload) {
      state.loading = payload
    }
  }
})

// 组件中使用
this.$store.commit('setLoading', true)
this.$store.commit('setLoading', false)

第三方库实现

使用现成的第三方库如 element-ui 的 loading 组件或 vue-loading-overlay

// 使用 element-ui
import { Loading } from 'element-ui'

let loadingInstance = Loading.service(options)
loadingInstance.close()

// 使用 vue-loading-overlay
import Loading from 'vue-loading-overlay'
import 'vue-loading-overlay/dist/vue-loading.css'

Vue.use(Loading)

样式和动画

为 loading 添加样式和动画效果,提升用户体验。

.loading-mask {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background: rgba(255, 255, 255, 0.7);
  display: flex;
  justify-content: center;
  align-items: center;
  z-index: 9999;
}

.loading-spinner {
  width: 40px;
  height: 40px;
  border: 4px solid #f3f3f3;
  border-top: 4px solid #3498db;
  border-radius: 50%;
  animation: spin 1s linear infinite;
}

@keyframes spin {
  0% { transform: rotate(0deg); }
  100% { transform: rotate(360deg); }
}

请求拦截器集成

在 axios 拦截器中自动显示和隐藏 loading,减少手动调用的代码量。

Vue全局loading实现

// http.js
import axios from 'axios'

let loadingCount = 0

axios.interceptors.request.use(config => {
  loadingCount++
  showLoading()
  return config
})

axios.interceptors.response.use(response => {
  loadingCount--
  if (loadingCount === 0) {
    hideLoading()
  }
  return response
}, error => {
  loadingCount--
  if (loadingCount === 0) {
    hideLoading()
  }
  return Promise.reject(error)
})

标签: 全局Vue
分享给朋友:

相关文章

Vue实现数据检验

Vue实现数据检验

Vue 数据校验的实现方法 在Vue中实现数据校验可以通过多种方式完成,以下是常见的几种方法: 使用Vue的内置指令 Vue提供了一些内置指令如v-model和v-bind可以结合HTML5的表单验…

Vue实现图片 放大

Vue实现图片 放大

Vue实现图片放大功能 使用v-viewer插件 安装v-viewer插件: npm install v-viewer 在main.js中引入并配置: import Viewer from 'v-…

Vue 实现登出功能

Vue 实现登出功能

实现登出功能的方法 在Vue中实现登出功能通常涉及清除用户认证信息、重置应用状态并跳转到登录页面。以下是几种常见的实现方式: 清除本地存储的token localStorage.removeIte…

Vue submit实现导出

Vue submit实现导出

Vue 中实现导出功能的方法 在 Vue 项目中实现导出功能,通常可以通过前端生成文件或调用后端接口导出数据。以下是几种常见的实现方式: 前端生成 Excel 文件 使用 xlsx 库可以方便地在前…

Vue拖拽怎么实现

Vue拖拽怎么实现

Vue拖拽实现方法 使用Vue实现拖拽功能可以通过原生HTML5的拖拽API或第三方库如vuedraggable来实现。以下是两种常见的方法: 使用HTML5拖拽API HTML5提供了原生的拖拽A…

Vue实现过期退出

Vue实现过期退出

Vue实现过期退出功能的方法 在Vue应用中实现过期退出功能通常涉及以下步骤: 设置登录状态和过期时间 在用户登录成功后,将token和过期时间存储在本地存储或Vuex中: localStora…