vue3 实现自定义指令 v-loading(基于 ant design 的 spin 组件实现)

Vue动态加载遮罩组件实现无干扰样式
文章描述了如何使用Vue在不干扰原有样式的情况下,通过动态创建`Spin`组件实现加载时的遮罩效果,同时确保在组件挂载和更新时的正确操作。

想法: 本来是想简单的通过对指令的绑定节点设置相对定位然后在其子级创建loading组件覆盖原有元素,但考虑到强制改变节点样式可能对原有样式产生干扰,于是有了新的想法。

import { render, h } from 'vue'
import { Spin } from 'ant-design-vue';
const mount = (el: HTMLElement): void => {
  let parent: HTMLElement | null = el.querySelector('#__LOADING_PARENT__')
  if (!parent) {
    parent = document.createElement('div')
    parent.style.position = 'relative'
    parent.style.alignSelf = 'flex-start'
    parent.id = '__LOADING_PARENT__'
    if (el.firstChild) {
      el.insertBefore(parent, el.firstChild)
    } else {
      el.appendChild(parent)
    }
  }
  parent.style.opacity = '1'
  const elStyle = window.getComputedStyle(el, null)
  const style = {
    display: 'flex',
    alignItems: 'center',
    justifyContent: 'center',
    position: 'absolute',
    flexDirection: 'column',
    top: `-${elStyle.paddingTop}`,
    left: `-${elStyle.paddingLeft}`,
    width: `${el.clientWidth}px`,
    height: `${el.clientHeight}px`,
    backgroundColor: 'rgba(209, 238, 245, .8)',
    opacity: 1,
    zIndex: 1000
  }
  render(h(Spin, { class: 'directive-loading', tip: '加载中...', size: 'large', style }), parent)
}
const unmount = (el: HTMLElement) => {
  const loading: HTMLElement | null = el.querySelector('#__LOADING_PARENT__')
  if (loading && loading.parentNode === el) {
    el.removeChild(loading)
  }
}
export default {
  // 在绑定元素的父组件 及他自己的所有子节点都挂载完成后调用
  mounted: (el: HTMLElement, binding: any) => {
    binding.value && mount(el)
  },
  // 在绑定元素的父组件 及他自己的所有子节点都更新后调用
  updated: (el: HTMLElement, binding: any) => {
    setTimeout(() => {
      binding.value ? mount(el) : unmount(el)
    })
  }
}

### ant-design-vue Loading 组件的使用方法 `ant-design-vue` 提供了一个灵活且易于使用的 `Loading` 功能,通常通过 `Spin` 组件实现[^1]。该组件用于显示加载状态,适用于页面或特定区域的内容尚未完全加载的情况。 #### Spin 组件基本用法 以下是 `Spin` 组件的基本用法: ```vue <template> <a-spin :spinning="isLoading"> <!-- 需要被包裹的内容 --> <div class="content">这里是需要加载的内容</div> </a-spin> </template> <script> export default { data() { return { isLoading: true, // 控制加载状态 }; }, }; </script> ``` 在此示例中,`spinning` 属性决定了是否显示加载动画。当 `isLoading` 设置为 `true` 时,会显示默认的加载效果;设置为 `false` 则隐藏加载效果并显示内部内容。 --- #### 自定义提示信息 如果希望在加载过程中显示自定义的文字提示,可以通过 `tip` 属性指定文字内容: ```vue <template> <a-spin :spinning="isLoading" tip="正在加载..."> <div class="content">这里是需要加载的内容</div> </a-spin> </template> ``` 此功能允许开发者向用户传达更具体的信息,提升用户体验[^1]。 --- #### 延迟加载 为了防止短暂的加载状态影响视觉体验,可以设置延迟时间(单位为毫秒)。只有当加载持续超过设定的时间时才会显示加载动画: ```vue <template> <a-spin :spinning="isLoading" delay="500"> <div class="content">这里是需要加载的内容</div> </a-spin> </template> ``` 在这个例子中,即使 `isLoading` 被设为 `true`,加载动画也会等待至少 500 毫秒才显现出来[^1]。 --- #### 全局加载遮罩 对于整个页面范围内的加载状态,可以结合 `wrapperClassName` 和 CSS 来创建全局遮罩层: ```vue <template> <a-spin :spinning="isLoading" size="large" wrapper-class-name="full-screen-loading"> <router-view /> </a-spin> </template> <style scoped> .full-screen-loading { position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: rgba(255, 255, 255, 0.8); } </style> ``` 这段代码展示了如何利用 `Spin` 创建覆盖全屏的加载遮罩,并调整背景颜色以增强可见度[^1]。 --- ### 总结 以上介绍了 `ant-design-vue` 中 `Spin` 组件的主要特性及其典型应用场景。无论是局部还是全局的加载需求,都可以借助这一强大的工具快速实现
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值