vue全局Loading

本文介绍了如何在Element-UI框架中创建和管理全局Loading组件,包括startLoading、endLoading函数以及showLoading和hideLoading方法的使用,以及在Vue项目中引入和在页面上应用的示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

创建loading.js

import { Loading } from 'element-ui'

let loadingCount = 0
let loading

const startLoading = (text) => {
  loading = Loading.service({
    lock: true,
    text: text || '拼命加载中...', // 可以自定义文字
    spinner: 'iconfont icon-loading user-loading', // 自定义加载图标类名
    background: 'rgba(0, 0, 0, 0.7)'// 遮罩层背景色
  })
}

const endLoading = () => {
  loading.close()
}

function showLoading(text) {
  if (loadingCount === 0) {
    startLoading(text)
  }
  loadingCount += 1
}

function hideLoading() {
  if (loadingCount <= 0) {
    return
  }
  loadingCount -= 1
  if (loadingCount === 0) {
    endLoading()
  }
}
export default {
  hideLoading,
  showLoading
}

user-loading.scss

// 全局 loading 
@keyframes rotating {
  from {
    transform: rotate(0);
  }
  to {
    transform: rotate(360deg);
  }
}
.el-loading-mask > .el-loading-spinner>.user-loading{
    animation: rotating 2s linear infinite ;
    display: inline-block;
    font-size: 40px !important;
}

main.js 引入

// 全局loading
import '@/styles/user-loading.scss'
import useLoading from './utils/loading'
Vue.prototype.$useLoading = useLoading

页面使用

this.$useLoading.showLoading('正在为您翻译,请稍后...')
this.$useLoading.hideLoading()

### Vue 实现和修改全局 Loading 组件方法 #### 创建 Loading 组件 为了实现一个可复用的全局 `Loading` 组件,在项目中首先需要创建一个新的组件文件,比如命名为 `Loading.vue`。此组件应具备基本结构以便于后续扩展。 ```html <template> <div v-if="visible" class="loading-mask"> <div class="spinner"></div> <!-- 可选:添加一些文本 --> <p v-if="text">{{ text }}</p> </div> </template> <script> export default { name: 'Loading', props: { visible: Boolean, text: String } } </script> <style scoped> .loading-mask { position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: rgba(0, 0, 0, .5); display: flex; justify-content: center; align-items: center; } .spinner { border: 8px solid #f3f3f3; /* Light grey */ border-top: 8px solid #3498db; /* Blue */ border-radius: 50%; width: 60px; height: 60px; animation: spin 2s linear infinite; } @keyframes spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } } </style> ``` #### 注册为全局组件 为了让上述 `Loading` 组件可以在整个应用程序范围内被调用而无需每次都单独导入,应当将其作为插件形式注册到应用实例上[^1]。 ```javascript import Vue from 'vue'; import LoadingComponent from './components/Loading.vue'; // 定义插件对象 const LoadingPlugin = { install(Vue) { const LoadingConstructor = Vue.extend(LoadingComponent); let loadingInstance; Object.defineProperty(Vue.prototype, '$loading', { get() { return (options = {}) => { if (!loadingInstance) { loadingInstance = new LoadingConstructor({ el: document.createElement('div') }); document.body.appendChild(loadingInstance.$el); } // 设置属性值 for (let key in options) { loadingInstance[key] = options[key]; } return loadingInstance; }; }, }); Vue.mixin({ created() { this.$loading = Vue.prototype.$loading.bind(this); } }); } }; Vue.use(LoadingPlugin); ``` #### 使用高阶函数简化 API 调用 对于更复杂的场景,如需结合异步操作自动控制加载状态,则可以通过编写辅助工具函数进一步优化API接口设计[^4]。 ```javascript function withLoading(fn) { return function(...args) { this.$loading({ visible: true }); // 显示加载层 try { fn.apply(this, args).finally(() => { setTimeout(() => { this.$loading({ visible: false }); // 隐藏加载层 }, 300); // 延迟一段时间再关闭以获得更好的用户体验 }); } catch(error){ console.error(error); this.$loading({ visible: false }); } } } ``` 在实际业务逻辑里可以直接这样使用: ```javascript methods: { async fetchData() { await withLoading.call(this, () => fetch('/api/data').then(response => response.json()) )(); // 处理获取的数据... } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值