当前位置:首页 > VUE

vue实现loading页面

2026-03-08 14:48:45VUE

实现全局Loading组件

components文件夹下创建Loading.vue文件:

<template>
  <div v-if="isLoading" class="loading-overlay">
    <div class="spinner"></div>
  </div>
</template>

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

<style>
.loading-overlay {
  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;
  z-index: 9999;
}

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

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

注册全局Loading

main.js中注册为全局组件:

vue实现loading页面

import Vue from 'vue'
import App from './App.vue'
import Loading from './components/Loading.vue'

Vue.component('Loading', Loading)

const loading = new Vue(Loading).$mount()
document.body.appendChild(loading.$el)

Vue.prototype.$loading = {
  show: () => loading.show(),
  hide: () => loading.hide()
}

new Vue({
  render: h => h(App)
}).$mount('#app')

在请求拦截器中使用

在axios拦截器中控制Loading显示:

import axios from 'axios'

axios.interceptors.request.use(config => {
  Vue.prototype.$loading.show()
  return config
}, error => {
  Vue.prototype.$loading.hide()
  return Promise.reject(error)
})

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

按需使用的示例

在组件中手动控制Loading:

vue实现loading页面

export default {
  methods: {
    fetchData() {
      this.$loading.show()
      axios.get('/api/data')
        .then(response => {
          // 处理数据
        })
        .finally(() => {
          this.$loading.hide()
        })
    }
  }
}

路由切换时的Loading

在路由配置中添加导航守卫:

import Router from 'vue-router'

const router = new Router({
  routes: [...]
})

router.beforeEach((to, from, next) => {
  Vue.prototype.$loading.show()
  next()
})

router.afterEach(() => {
  setTimeout(() => {
    Vue.prototype.$loading.hide()
  }, 300)
})

export default router

优化加载体验

添加最小显示时间避免闪烁:

let minLoadingTime = 500
let startTime = 0

Vue.prototype.$loading = {
  show: () => {
    startTime = Date.now()
    loading.show()
  },
  hide: () => {
    const elapsed = Date.now() - startTime
    const remaining = minLoadingTime - elapsed
    if (remaining > 0) {
      setTimeout(() => loading.hide(), remaining)
    } else {
      loading.hide()
    }
  }
}

标签: 页面vue
分享给朋友:

相关文章

vue实现点击旋转轮盘

vue实现点击旋转轮盘

实现点击旋转轮盘效果 在Vue中实现点击旋转轮盘效果,可以通过CSS动画和Vue的数据绑定结合完成。以下是一个完整的实现方案: 准备工作 需要安装Vue.js环境,可以通过CDN引入或使用Vue C…

vue实现发表

vue实现发表

Vue 实现发表功能 在 Vue 中实现发表功能通常涉及表单处理、数据绑定和网络请求。以下是实现步骤和代码示例: 表单设计与数据绑定 创建一个表单用于输入发表内容,使用 v-model 进行数据双向…

vue实现贴图

vue实现贴图

Vue 实现贴图功能 在Vue中实现贴图功能通常涉及将图片动态添加到指定位置或元素上。以下是几种常见实现方式: 使用v-bind动态绑定图片 通过数据驱动的方式动态更换图片源: <templ…

vue实现新闻

vue实现新闻

Vue 实现新闻功能 使用 Vue 实现新闻功能通常涉及新闻列表展示、新闻详情页、分类筛选等模块。以下是实现的基本思路和代码示例。 新闻列表展示 通过 Vue 组件展示新闻列表,通常使用 v-for…

vue实现剪辑

vue实现剪辑

Vue 实现视频剪辑功能 在Vue中实现视频剪辑功能通常需要结合HTML5的<video>元素和第三方库(如FFmpeg.js或Video.js)。以下是几种常见的实现方法: 使用FFm…

vue实现suspense

vue实现suspense

Vue 3 中实现 Suspense Suspense 是 Vue 3 引入的一个内置组件,用于处理异步依赖的加载状态。它允许在等待异步组件或异步数据加载时显示一个后备内容(fallback),直到异…