最近一段时间,在做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. Java开发学习(四十二)----MyBatisPlus查询语句之条件查询

    一.条件查询的类 MyBatisPlus将书写复杂的SQL查询条件进行了封装,使用编程的形式完成查询条件的组合. 这个我们在前面都有见过,比如查询所有和分页查询的时候,都有看到过一个Wrapper类, ...

  2. 银河麒麟V10 SP1服务器操作系统-单用户模式与救援模式调试方法

    单用户模式 单用户模式:该模式下系统并没有完全运行进来,只是部分程序运行,包括网络服务,ssh服务等部分服务未运行,因此无法通过远程登录到操作系        统.进入单用户方式进行系统维护由是ROO ...

  3. 快速构建一个简单的Springboot-web项目

    web项目基本的核心成分 数据落地 MYSQL数据库 登录标识 JWT :{Java web token } 记录有效登录状态 以及缓存常用数据: Redis 数据库与JAVA实体的快速自动映射ORM ...

  4. 《吐血整理》高级系列教程-吃透Fiddler抓包教程(35)-Fiddler如何抓取微信小程序的包-下篇

    1.简介 通过前边和宏哥的学习,我们了解到Android 7.0 之后增加了对第三方证书的限制,抓包工具(charles.fiddler等)提供的证书都无法通过校验,也就无法抓取HTTPS请求了,对测 ...

  5. Type Script 在流程设计器的落地实践

    流程设计器项目介绍 从事过BPM行业的大佬必然对流程建模工具非常熟悉,做为WFMC三大体系结构模型中的核心模块,它是工作流的能力模型,其他模块都围绕工作流定义来构建. 成熟的建模工具通过可视化的操作界 ...

  6. USB限流IC,限流开关保护芯片

    PW1503和PW1502是超低RDS(ON)开关,具有可编程电流限制的USB限流IC,以保护电源于过电流负载和正极负极短路的保护.它具有过温保护以及反向闭锁功能. PW1503,PW1502均采用S ...

  7. filter: hue-rotate() 制作炫酷的文字效果

    主要用到属性有: filter 滤镜的 hue-rotate 色调旋转, text-shadow 文字阴影, transform 的 scale缩放, transition 过渡属性, animati ...

  8. O-MVLL代码混淆方式

    在介绍O-MVLL之前,首先介绍什么是代码混淆以及基于LLVM的代码混淆,O-MVLL项目正是基于此而开发来的. 有关O-MVLL的概括介绍以及安装和基本使用方式,可参见另一篇随笔 https://w ...

  9. hyperf 配置 https 访问

    最近用hyperf写了支付系统,本地调试支付完成,打包上线部署,要解决https协议进行相应的访问,但是hyperf 官方没有找到相关的ssl配置说明.搜了一下soole还是有几个案例说明,据我的了解 ...

  10. BUU_RE学习记录

    一.easyre 1.010打开,直接搜flag,得到flag 二.reverse1 1.先查壳,得知是64位无壳,直接用IDA打开 2.shiftF12查找字符串,发现关键语句 3.查看相应代码,F ...