最近一段时间,在做h5的移动端项目,UI组件库使用的vant,vant组件中的loading实在难用,无法包裹某个块进行loading,也无法对非组件的标签进行loading,所以想着自定义写个指令,挂载全局,通过v-loading的方式实现控制加载,好了,话不多说,vue3的自定义指令实现,和vue2还是有区别的,下面进入正题

首先,写个loading组件:

内容根据自己的需求来,可以是loading的图片,或者自己写的loading样式都行,组件怎么写,此处就不详说了,非本篇博文重点

接着,创建一个js文件,loading.js,用于写指令相关的方法内容:

//引入写好的loading组件
import Loading from '../components/loading.vue'; // 封装,挂载dom节点在 绑定了v-loading的标签dom节点之下的函数
function createLoading(el){
// 创建div标签
const loadingDom = document.createElement('div')
// 添加自定义属性作为标识,避免重复loading
loadingDom.setAttribute('data-v','loading')
// 设置样式,父元素相对定位,子元素绝对定位父元素之上
el.style.position = 'relative'
loadingDom.style.width = `${el.offsetWidth}px`
loadingDom.style.height = `${el.offsetHeight}px`
loadingDom.style.maxHeight = '100vh'
loadingDom.style.position = `absolute`
loadingDom.style.background = `black`
loadingDom.style.display = `flex`
loadingDom.style.justifyContent = `center`
loadingDom.style.alignItems = `center`
loadingDom.style.opacity = '.16'
loadingDom.style.top = '0'
loadingDom.style.borderRadius = 'inherit'
// 创建APP实例,传入loading组件,并且挂载loading组件和创建的标签
const app = createApp(Loading)
const instance = app.mount(loadingDom)
loadingDom.appendChild(instance.$el)
el.appendChild(loadingDom)
} // 创建自定义指令
const vLoading = {
//mounted的时候,v-loading变量值为true时,加载loading
mounted(el,binding) {
if(binding.value === true){
createLoading(el)
}
},
//update的时候
updated(el,binding){
//v-loading 的值为false,并且该节点下最后一个元素是loading时,移除节点
if(binding.value === false && el.lastChild.dataset.v === 'loading'){
el.removeChild(el.lastChild)
return
}
//v-loading 的值为true,并且该节点下没有loading节点时,调用函数,挂载loading
if(binding.value === true && el.lastChild.dataset.v !== 'loading'){
createLoading(el)
}
}
} //导出创建好的指令
export default vLoading

到此,指令已经创建好了,上述代码如果是在setup标签中创建的,那么在该页面中,组件或者标签 通过v-loading绑定即可使用,接下来我们挂载全局

//在main入口文件中,引入刚刚创建好的指令
import vLoading from './composables/loading' import {createApp} from "vue";
import "./style.scss";
import App from "./App.vue";
import vLoading from './composables/loading'
import router from "./router"; const app = createApp(App);
app.use(router);
// 调用app.directive,传入自定义指令名,和刚才定义好的指令内容
app.directive('loading',vLoading) app.mount("#app");

接下来是在组件中的使用,通过变量控制显示与否即可

效果图如下,不会截动图,就这样啦

vue3 setup语法糖下,vue自定义指令的实现,以及指令全局挂载,自定义v-loading的实现的更多相关文章

  1. 基于SqlSugar的开发框架循序渐进介绍(11)-- 使用TypeScript和Vue3的Setup语法糖编写页面和组件的总结

    随着Vue3和TypeScript的大浪潮不断袭来,越来越多的Vue项目采用了TypeScript的语法来编写代码,而Vue3的JS中的Setup语法糖也越来越广泛的使用,给我们这些以前用弱类型的JS ...

  2. vue3 学习笔记(九)——script setup 语法糖用了才知道有多爽

    刚开始使用 script setup 语法糖的时候,编辑器会提示这是一个实验属性,要使用的话,需要固定 vue 版本. 在 6 月底,该提案被正式定稿,在 v3.1.3 的版本上,继续使用但仍会有实验 ...

  3. 【Vue3.0】关于 script setup 语法糖的用法

    script setup - 简介 先来看一看官网关于 <script setup> 的介绍: 要彻底的了解 setup 语法糖,你必须先明确 setup() 这个 组合式API 官网中对 ...

  4. Vue3中setup语法糖学习

    目录 1,前言 2,基本语法 2,响应式 3,组件使用 3.1,动态组件 3.2,递归组件 4,自定义指令 5,props 5.1,TypeScript支持 6,emit 6.1,TypeScript ...

  5. Vue3.2中的setup语法糖,保证你看的明明白白!

    vue3.2 到底更新了什么? 根据原文内容的更新的内容主要有以下 5 块: 1.SSR:服务端渲染优化.@vue/server-renderer包加了一个ES模块创建, 与Node.js解耦,使在非 ...

  6. Vue3的script setup语法糖这么好用的吗????

    最近发现这个vue3居然还可以这样写 原始写法 <template> <h1>Tangdoudou</h1> <h1>{{ num }}</h1& ...

  7. vue3.0+ts+setup语法糖props写法

    写法一 import defaultImg from '@/assets/images/defaultImg.png' const props = defineProps({ src: { type: ...

  8. 传说中 VUE 的“语法糖”到底是啥?

    一.什么是语法糖? 语法糖也译为糖衣语法,是由英国计算机科学家彼得·约翰·兰达(Peter J. Landin)发明的一个术语.指的是计算机语言中添加的一种语法,在不影响功能的情况下,添加某种简单的语 ...

  9. Vue3 Composition API写烦了,试试新语法糖吧—setup script

    前言 Vue3发布近一年了,相信大家对Vue3的新特性,新语法都很熟悉了.那么在使用Composition API的过程中,有没有觉得整个过程比较繁琐.比如你的模板里用到了大量的state和方法的时候 ...

  10. Vue01 Vue介绍、Vue使用、Vue实例的创建、数据绑定、Vue实例的生命周期、差值与表达式、指令与事件、语法糖

    1 Vue介绍 1.1 官方介绍 vue是一个简单小巧的渐进式的技术栈,它提供了Web开发中常用的高级功能:视图和数据的解耦.组件的服用.路由.状态管理.虚拟DOM 说明:简单小巧 -> 压缩后 ...

随机推荐

  1. Redux 的困扰与如何技术选型

    文章的名字我想了很久,备选项有"我再不推荐 Redux","Redux 为什么令我头疼","Redux 进化启示录"等等.通过这一系列名字我 ...

  2. JavaSE -进阶基础---反射技术

    反射常见用法: Java 反射机制是在运行状态中,对于任意一个类,都能够获得这个类的所有属性和方法,对于任意一个对象都能够调用它的任意一个属性和方法.这种在运行时动态的获取信息以及动态调用对象的方法的 ...

  3. postman的运用

    链接: https://pan.baidu.com/s/1gfaKoAv 密码: dp7t 最近要测试和其他系统对接,忽然想起了postman这款url测试神器. 现分享如下: 下载完成后解压到文件夹 ...

  4. 【JVM故障问题排查心得】「内存诊断系列」JVM内存与Kubernetes中pod的内存、容器的内存不一致所引发的OOMKilled问题总结(上)

    背景介绍 在我们日常的工作当中,通常应用都会采用Kubernetes进行容器化部署,但是总是会出现一些问题,例如,JVM堆小于Docker容器中设置的内存大小和Kubernetes的内存大小,但是还是 ...

  5. MySQL 的 NULL 值是怎么存储的?

    大家好,我是小林. 之前有位读者在面字节的时候,被问到这么个问题: 如果你知道 MySQL 一行记录的存储结构,那么这个问题对你没什么难度. 如果你不知道也没关系,这次我跟大家聊聊 MySQL 一行记 ...

  6. jquery 操作样式

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. 【终极解决办法】pyinstaller打包exe没有错误,运行exe提示Failed to execute script 'mainlmageWindows' due tounhandled exception: No module named 'docx'

    一.通过pyinstaller打包exe可执行文件,由于我的py是多个,所以要先生成spec文件,代码如下: pyi-makespec mainImageWindows.py 此时生产了一个mainI ...

  8. 【Java EE】Day11 BootStrap、响应式布局、栅格系统、CSS样式、案例

    一.BootStrap介绍 https://v3.bootcss.com/css/#overview 1.概念 基于三剑客开发的前端开发框架 定义了许多css样式和js插件,从而得到丰富的页面效果 依 ...

  9. 使用Spring Reactor优化推荐流程

    1. 背景 公司有一个推荐系统Rec,这个系统的主要功能是: 向外部系统提供推荐接口 根据请求获取推荐策略 根据推荐策略完成推荐的召回.过滤.打分.排序阶段 Rec作为微服务中的一环,本身不存储召回的 ...

  10. 配置 DosBox

    配置 DosBox DosBox 在高分辨的屏幕上窗口很小. 修改分辨率 Win7 及以上配置文件位于{system drive}:\Users\{username}\AppData\Local\DO ...