当前位置: 首页 > article >正文

vue3自定义loading加载动画指令

 //vLoading.ts

import { ref, watch } from 'vue'; 
 
let  divEle:any = null

// 创建一个 ref 用于管理加载状态 
export const vloadingShow = ref(false); 
 
export const vLoading = { 
  mounted(el: any, binding: any) { 
    // 
    const loadingDiv: any = document.createElement('div');  
    loadingDiv.classList.add('Svloading');  
    loadingDiv.style.position  = 'fixed'; 
    loadingDiv.style.top  = '0'; 
    loadingDiv.style.left  = '0'; 
    loadingDiv.style.width  = '100%'; 
    loadingDiv.style.height  = '100%'; 
    loadingDiv.style.backgroundColor  = 'rgba(0, 0, 0, 0.2)'; 
    loadingDiv.style.display  = 'flex';   
    loadingDiv.style.justifyContent  = 'center'; 
    loadingDiv.style.alignItems  = 'center'; 
    loadingDiv.style.zIndex  = 9999; 
    loadingDiv.style.userSelect  = 'none';  
    loadingDiv.style.webkitUserSelect  = 'none';  
    loadingDiv.style.msUserSelect  = 'none';  

    // 关闭的按钮
    const closeButton:any = document.createElement('div');  
    closeButton.textContent  = '关闭'; 
    closeButton.style.position  = 'absolute'; 
    closeButton.style.top  = '10px'; 
    closeButton.style.right  = '10px'; 
    closeButton.style.backgroundColor  = 'transparent'; 
    closeButton.style.color  = 'white'; 
    closeButton.style.border  = 'none'; 
    closeButton.style.fontSize  = '20px'; 
    closeButton.style.cursor  = 'pointer'; 


    closeButton.addEventListener('click',  () => { 
      vloadingShow.value  = false; 
    }); 
 
    const img = document.createElement('img');  
    img.src  = '/svLogo.gif';  
    img.alt  = '加载中。。。'; 
    img.style.width  = '100px'; 
 

    loadingDiv.appendChild(img);  
    loadingDiv.appendChild(closeButton);  

    


    el.loadingDiv  = loadingDiv;

    divEle = loadingDiv
    if (vloadingShow.value)  { 
      document.body.appendChild(loadingDiv);  
    } 
  }, 
  unmounted(el: any) { 
    // 组件销毁时,移除 Svloading 元素 
    const loadingDiv = el.loadingDiv;  
    if (loadingDiv) { 
      const parent = loadingDiv.parentNode;  
      if (parent) { 
        parent.removeChild(loadingDiv);  
      } 
    } 
  }, 
}; 

watch(() => vloadingShow.value,  (newVal) => { 
  if (newVal && divEle) { 
    document.body.appendChild(divEle);  
  } else { 
    // 如果需要隐藏加载,移除所有加载元素 
    const loadingElements = document.querySelectorAll('.Svloading');  
    loadingElements.forEach((element)  => { 
      const parent = element.parentNode;  
      if (parent) { 
        parent.removeChild(element);  
      } 
    }); 
  } 
}); 
 

//main.ts

import { vLoading } from '@/utils/directive/vLoading'; 


const app = createApp(App);

// 注册指令
app.directive('Svloading',  vLoading);

app.mount('#app')

使用



http://www.kler.cn/a/542745.html

相关文章:

  • “可通过HTTP获取远端WWW服务信息”漏洞修复
  • 记录docker 卡住不动了
  • ASP.NET Core 如何使用 C# 从端点发出 GET 请求
  • 代码随想录day11
  • 微信小程序分包异步化
  • vcredist_x64.exe 是 Microsoft Visual C++ Redistributable 的 64 位版本
  • Java集合List详解(带脑图)
  • 基于微信小程序的刷题系统的设计与实现springboot+论文源码调试讲解
  • 开发中用到的设计模式
  • Excel 笔记
  • 【哇! C++】第一个C++语言程序
  • docker compose部署dragonfly
  • 《pytorch》——优化器的解析和使用
  • 【含文档+PPT+源码】基于微信小程序的在线考试与选课教学辅助系统
  • Goland的context原理(存在问题,之前根本没有了解,需要更加深入了解)
  • 前端首屏时间优化方案
  • Python实现机器学习舆情分析项目的经验分享
  • Centos10 Stream 基础配置
  • 数据结构 双链表的模拟实现
  • 【前端】【面试】ref与reactive的区别
  • C# OpenCV机器视觉:模仿Halcon各向异性扩散滤波
  • 利用Ollama本地部署 DeepSeek
  • Java进阶篇之NIO基础
  • 前端常用校验规则
  • AI 编程开发插件codeium Windsurf(vscode、editor) 安装
  • MyBatis-Plus与PageHelper的jsqlparser库冲突问题