当前位置:首页 > VUE

Vue全局loading实现

2026-01-17 05:42:10VUE

Vue全局loading实现

Vue全局Loading的实现方法

使用Vue插件封装全局Loading组件

创建一个独立的Loading组件,通过Vue插件机制注册为全局组件或方法。

<template>
  <div v-if="visible" class="global-loading">
    <div class="loading-spinner"></div>
    <p v-if="text">{{ text }}</p>
  </div>
</template>

<script>
export default {
  data() {
    return {
      visible: false,
      text: ''
    }
  },
  methods: {
    show(text = '') {
      this.text = text
      this.visible = true
    },
    hide() {
      this.visible = false
    }
  }
}
</script>

<style>
.global-loading {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background: rgba(0, 0, 0, 0.5);
  display: flex;
  flex-direction: column;
  justify-content: center;
  align-items: center;
  z-index: 9999;
}

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

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

创建Vue插件并注册

// loading-plugin.js
import LoadingComponent from './LoadingComponent.vue'

const LoadingPlugin = {
  install(Vue) {
    const LoadingConstructor = Vue.extend(LoadingComponent)
    const instance = new LoadingConstructor()
    instance.$mount(document.createElement('div'))
    document.body.appendChild(instance.$el)

    Vue.prototype.$loading = {
      show(text) {
        instance.show(text)
      },
      hide() {
        instance.hide()
      }
    }
  }
}

export default LoadingPlugin

在main.js中安装插件

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

Vue.use(LoadingPlugin)

在组件中使用全局Loading

// 显示loading
this.$loading.show('加载中...')

// 隐藏loading
this.$loading.hide()

结合axios拦截器实现请求自动loading

import axios from 'axios'

let loadingCount = 0

axios.interceptors.request.use(config => {
  if (loadingCount === 0) {
    Vue.prototype.$loading.show()
  }
  loadingCount++
  return config
})

axios.interceptors.response.use(
  response => {
    loadingCount--
    if (loadingCount === 0) {
      Vue.prototype.$loading.hide()
    }
    return response
  },
  error => {
    loadingCount--
    if (loadingCount === 0) {
      Vue.prototype.$loading.hide()
    }
    return Promise.reject(error)
  }
)

使用Vuex管理全局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
    }
  },
  actions: {
    showLoading({ commit }, text) {
      commit('SHOW_LOADING', text)
    },
    hideLoading({ commit }) {
      commit('HIDE_LOADING')
    }
  }
})

在组件中通过Vuex控制Loading

// 显示loading
this.$store.dispatch('showLoading', '加载中...')

// 隐藏loading
this.$store.dispatch('hideLoading')

以上方法提供了多种实现全局Loading的方案,可以根据项目需求选择适合的方式。插件方式适合简单项目,而结合Vuex的方式更适合大型复杂应用。

Vue全局loading实现

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

相关文章

Vue 实现头条评论

Vue 实现头条评论

Vue 实现头条评论功能 要实现类似头条的评论功能,可以按照以下步骤进行开发: 1. 创建评论组件结构 使用 Vue 单文件组件结构,包含评论列表、评论输入框和回复功能。基本模板如下: &…

Vue数据依赖实现

Vue数据依赖实现

Vue数据依赖实现原理 Vue的数据依赖实现基于响应式系统,核心是通过Object.defineProperty或Proxy拦截数据读写操作,结合发布-订阅模式自动追踪依赖和触发更新。 核心机制…

Vue实现ping

Vue实现ping

Vue实现ping功能的方法 在Vue中实现ping功能,可以通过调用操作系统的ping命令或使用JavaScript的WebSocket等方式。以下是几种常见的方法: 使用Node.js的chi…

Vue实现postMessage

Vue实现postMessage

Vue 中使用 postMessage 进行跨窗口通信 在 Vue 中使用 postMessage 可以实现跨窗口通信,适用于不同窗口或 iframe 之间的数据传递。以下是实现方法: 发送…

Vue语法实现

Vue语法实现

Vue 语法实现 Vue.js 是一个渐进式 JavaScript 框架,用于构建用户界面。以下是 Vue 的核心语法实现方式: 模板语法 Vue 使用基于 HTML 的模板语法,允许开发者声明式…

Vue 实现登出

Vue 实现登出

Vue 实现登出的方法 在 Vue 应用中实现登出功能通常涉及清除用户认证信息、重定向到登录页面或主页,并可能调用后端 API 注销会话。以下是几种常见的实现方式: 清除本地存储的认证信息 大多数前…