当前位置:首页 > VUE

Vue全局loading实现

2026-01-17 05:42:10VUE

Vue全局Loading的实现方法

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

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

Vue全局loading实现

<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
分享给朋友:

相关文章

Vue语法实现

Vue语法实现

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

Vue前端路由实现

Vue前端路由实现

Vue前端路由的实现方式 Vue前端路由通常通过vue-router库实现,它是Vue.js官方的路由管理器,用于构建单页面应用(SPA)。以下是核心实现方法和步骤: 安装vue-router 通过…

Vue实现ui界面

Vue实现ui界面

Vue实现UI界面的方法 使用Vue CLI创建项目 通过Vue CLI快速搭建项目基础结构,确保开发环境配置完整。安装完成后运行vue create project-name选择预设配置或手动配置特…

实现vue全局组件

实现vue全局组件

注册全局组件 在Vue中注册全局组件可以通过Vue.component方法完成。该方法接受两个参数:组件名称和组件选项对象。全局注册的组件可以在任何Vue实例的模板中使用,无需再次注册。 impor…

Vue实现多个echarts排版

Vue实现多个echarts排版

实现多个 ECharts 实例的排版布局 在 Vue 中实现多个 ECharts 实例的排版布局,可以通过 CSS 布局结合 ECharts 的响应式设计来完成。以下是几种常见方法: 使用 Flex…

Vue实现页签功能

Vue实现页签功能

Vue实现页签功能的方法 使用动态组件和v-for指令 在Vue中可以通过动态组件结合v-for实现页签功能。定义一个数组存储页签数据,使用v-for渲染页签标题,通过v-bind:is动态加载对应组…