当前位置:首页 > VUE

vue实现全局loading

2026-01-18 13:13:27VUE

使用Vue插件实现全局Loading

在Vue项目中创建一个自定义插件,通过插件机制实现全局Loading功能。

// loading-plugin.js
const LoadingPlugin = {
  install(Vue) {
    const LoadingComponent = Vue.extend({
      template: `
        <div v-if="show" class="global-loading">
          <div class="loading-spinner"></div>
          <div class="loading-text">{{ text }}</div>
        </div>
      `,
      data() {
        return {
          show: false,
          text: '加载中...'
        }
      }
    })

    const loadingInstance = new LoadingComponent({
      el: document.createElement('div')
    })

    document.body.appendChild(loadingInstance.$el)

    Vue.prototype.$loading = {
      show(text) {
        loadingInstance.text = text || '加载中...'
        loadingInstance.show = true
      },
      hide() {
        loadingInstance.show = false
      }
    }
  }
}

export default LoadingPlugin

在main.js中注册插件:

import Vue from 'vue'
import LoadingPlugin from './loading-plugin'

Vue.use(LoadingPlugin)

使用Vuex管理Loading状态

通过Vuex集中管理全局Loading状态,便于跨组件控制。

vue实现全局loading

// store.js
export default new Vuex.Store({
  state: {
    loading: false,
    loadingText: '加载中...'
  },
  mutations: {
    SHOW_LOADING(state, text) {
      state.loading = true
      state.loadingText = text || '加载中...'
    },
    HIDE_LOADING(state) {
      state.loading = false
    }
  }
})

创建全局Loading组件:

// GlobalLoading.vue
<template>
  <div v-if="$store.state.loading" class="global-loading">
    <div class="loading-spinner"></div>
    <div class="loading-text">{{ $store.state.loadingText }}</div>
  </div>
</template>

<script>
export default {
  name: 'GlobalLoading'
}
</script>

在App.vue中引入:

vue实现全局loading

<template>
  <div id="app">
    <GlobalLoading />
    <router-view />
  </div>
</template>

使用axios拦截器实现请求Loading

结合axios拦截器自动显示和隐藏Loading状态。

// http.js
import axios from 'axios'
import store from './store'

const http = axios.create()

let requestCount = 0

http.interceptors.request.use(config => {
  requestCount++
  store.commit('SHOW_LOADING', config.loadingText)
  return config
})

http.interceptors.response.use(
  response => {
    requestCount--
    if (requestCount === 0) {
      store.commit('HIDE_LOADING')
    }
    return response
  },
  error => {
    requestCount--
    if (requestCount === 0) {
      store.commit('HIDE_LOADING')
    }
    return Promise.reject(error)
  }
)

export default http

使用CSS样式优化Loading效果

为Loading组件添加样式增强视觉效果。

.global-loading {
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  background-color: rgba(0, 0, 0, 0.5);
  display: flex;
  flex-direction: column;
  justify-content: center;
  align-items: center;
  z-index: 9999;
}

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

.loading-text {
  margin-top: 20px;
  color: white;
  font-size: 16px;
}

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

使用第三方库实现高级Loading效果

对于更复杂的需求,可以考虑使用第三方库如element-uivant的Loading组件。

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

let loadingInstance

Vue.prototype.$loading = {
  show() {
    loadingInstance = Loading.service({
      lock: true,
      text: '加载中',
      spinner: 'el-icon-loading',
      background: 'rgba(0, 0, 0, 0.7)'
    })
  },
  hide() {
    loadingInstance.close()
  }
}

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

相关文章

vue实现滑动

vue实现滑动

Vue 实现滑动效果 使用 CSS 过渡和动画 通过 Vue 的 transition 组件结合 CSS 过渡或动画实现滑动效果。适用于简单的元素入场/离场滑动。 <template>…

vue实现压缩上传文件

vue实现压缩上传文件

压缩上传文件的实现方法 在Vue中实现文件压缩和上传功能,可以通过以下步骤完成。该方法结合了前端文件压缩库和HTTP请求,确保文件在上传前被有效压缩。 安装必要的依赖 需要使用compressorj…

vue实现防抖节流

vue实现防抖节流

Vue 中实现防抖(Debounce) 防抖的核心是延迟执行函数,在连续触发时取消前一次的调用,只执行最后一次。适用于输入框搜索、窗口大小调整等场景。 方法1:使用 Lodash 的 _.debo…

vue设计与实现目录

vue设计与实现目录

以下是《Vue设计与实现》一书的典型目录结构(根据常见技术书籍及Vue核心内容整理): 响应式系统 响应式数据的基本原理 依赖收集与触发更新 实现简易响应式系统 Proxy与Refle…

vue按钮实现截屏

vue按钮实现截屏

Vue 按钮实现截屏的方法 在 Vue 项目中实现截屏功能可以通过多种方式完成,以下是几种常见的方法: 使用 html2canvas 库 安装 html2canvas 库: npm ins…

vue实现冰墩墩

vue实现冰墩墩

使用 Vue 实现冰墩墩动画 通过 Vue 的动画特性和 SVG 技术,可以动态渲染冰墩墩的形象。以下是具体实现方法: 准备 SVG 素材 冰墩墩的形象通常由多个 SVG 路径组成,包括身体轮廓、面…