vue3 setup语法糖下,vue自定义指令的实现,以及指令全局挂载,自定义v-loading的实现
最近一段时间,在做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的实现的更多相关文章
- 基于SqlSugar的开发框架循序渐进介绍(11)-- 使用TypeScript和Vue3的Setup语法糖编写页面和组件的总结
随着Vue3和TypeScript的大浪潮不断袭来,越来越多的Vue项目采用了TypeScript的语法来编写代码,而Vue3的JS中的Setup语法糖也越来越广泛的使用,给我们这些以前用弱类型的JS ...
- vue3 学习笔记(九)——script setup 语法糖用了才知道有多爽
刚开始使用 script setup 语法糖的时候,编辑器会提示这是一个实验属性,要使用的话,需要固定 vue 版本. 在 6 月底,该提案被正式定稿,在 v3.1.3 的版本上,继续使用但仍会有实验 ...
- 【Vue3.0】关于 script setup 语法糖的用法
script setup - 简介 先来看一看官网关于 <script setup> 的介绍: 要彻底的了解 setup 语法糖,你必须先明确 setup() 这个 组合式API 官网中对 ...
- Vue3中setup语法糖学习
目录 1,前言 2,基本语法 2,响应式 3,组件使用 3.1,动态组件 3.2,递归组件 4,自定义指令 5,props 5.1,TypeScript支持 6,emit 6.1,TypeScript ...
- Vue3.2中的setup语法糖,保证你看的明明白白!
vue3.2 到底更新了什么? 根据原文内容的更新的内容主要有以下 5 块: 1.SSR:服务端渲染优化.@vue/server-renderer包加了一个ES模块创建, 与Node.js解耦,使在非 ...
- Vue3的script setup语法糖这么好用的吗????
最近发现这个vue3居然还可以这样写 原始写法 <template> <h1>Tangdoudou</h1> <h1>{{ num }}</h1& ...
- vue3.0+ts+setup语法糖props写法
写法一 import defaultImg from '@/assets/images/defaultImg.png' const props = defineProps({ src: { type: ...
- 传说中 VUE 的“语法糖”到底是啥?
一.什么是语法糖? 语法糖也译为糖衣语法,是由英国计算机科学家彼得·约翰·兰达(Peter J. Landin)发明的一个术语.指的是计算机语言中添加的一种语法,在不影响功能的情况下,添加某种简单的语 ...
- Vue3 Composition API写烦了,试试新语法糖吧—setup script
前言 Vue3发布近一年了,相信大家对Vue3的新特性,新语法都很熟悉了.那么在使用Composition API的过程中,有没有觉得整个过程比较繁琐.比如你的模板里用到了大量的state和方法的时候 ...
- Vue01 Vue介绍、Vue使用、Vue实例的创建、数据绑定、Vue实例的生命周期、差值与表达式、指令与事件、语法糖
1 Vue介绍 1.1 官方介绍 vue是一个简单小巧的渐进式的技术栈,它提供了Web开发中常用的高级功能:视图和数据的解耦.组件的服用.路由.状态管理.虚拟DOM 说明:简单小巧 -> 压缩后 ...
随机推荐
- Redux 的困扰与如何技术选型
文章的名字我想了很久,备选项有"我再不推荐 Redux","Redux 为什么令我头疼","Redux 进化启示录"等等.通过这一系列名字我 ...
- JavaSE -进阶基础---反射技术
反射常见用法: Java 反射机制是在运行状态中,对于任意一个类,都能够获得这个类的所有属性和方法,对于任意一个对象都能够调用它的任意一个属性和方法.这种在运行时动态的获取信息以及动态调用对象的方法的 ...
- postman的运用
链接: https://pan.baidu.com/s/1gfaKoAv 密码: dp7t 最近要测试和其他系统对接,忽然想起了postman这款url测试神器. 现分享如下: 下载完成后解压到文件夹 ...
- 【JVM故障问题排查心得】「内存诊断系列」JVM内存与Kubernetes中pod的内存、容器的内存不一致所引发的OOMKilled问题总结(上)
背景介绍 在我们日常的工作当中,通常应用都会采用Kubernetes进行容器化部署,但是总是会出现一些问题,例如,JVM堆小于Docker容器中设置的内存大小和Kubernetes的内存大小,但是还是 ...
- MySQL 的 NULL 值是怎么存储的?
大家好,我是小林. 之前有位读者在面字节的时候,被问到这么个问题: 如果你知道 MySQL 一行记录的存储结构,那么这个问题对你没什么难度. 如果你不知道也没关系,这次我跟大家聊聊 MySQL 一行记 ...
- jquery 操作样式
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 【终极解决办法】pyinstaller打包exe没有错误,运行exe提示Failed to execute script 'mainlmageWindows' due tounhandled exception: No module named 'docx'
一.通过pyinstaller打包exe可执行文件,由于我的py是多个,所以要先生成spec文件,代码如下: pyi-makespec mainImageWindows.py 此时生产了一个mainI ...
- 【Java EE】Day11 BootStrap、响应式布局、栅格系统、CSS样式、案例
一.BootStrap介绍 https://v3.bootcss.com/css/#overview 1.概念 基于三剑客开发的前端开发框架 定义了许多css样式和js插件,从而得到丰富的页面效果 依 ...
- 使用Spring Reactor优化推荐流程
1. 背景 公司有一个推荐系统Rec,这个系统的主要功能是: 向外部系统提供推荐接口 根据请求获取推荐策略 根据推荐策略完成推荐的召回.过滤.打分.排序阶段 Rec作为微服务中的一环,本身不存储召回的 ...
- 配置 DosBox
配置 DosBox DosBox 在高分辨的屏幕上窗口很小. 修改分辨率 Win7 及以上配置文件位于{system drive}:\Users\{username}\AppData\Local\DO ...