Vue 3 的 teleport 组件封装为自定义指令

news/2025/1/20 16:30:51/文章来源:https://www.cnblogs.com/echohye/p/18238898

<Teleport> 是一个内置组件,它可以将一个组件内部的一部分模板“传送”到该组件的 DOM 结构外层的位置去。

https://cn.vuejs.org/guide/built-ins/teleport.html

为了更加简便灵活,可以将 Vue 3 的 <teleport> 组件类似的功能封装为自定义指令。当然,但在某些情况下,直接使用 <teleport> 组件会更合适。

自定义指令的实现步骤

  1. 创建自定义指令
    定义一个自定义指令 v-teleport,并在其 mountedunmounted 钩子中进行 DOM 操作。

  2. 挂载目标元素
    mounted 钩子中,将元素移动到指定的目标容器中。

  3. 卸载目标元素
    unmounted 钩子中,将元素从目标容器中移除。

实现代码

首先,创建一个自定义指令 v-teleport

// teleportDirective.js
export default {mounted(el, binding) {const targetSelector = binding.value || 'body';const targetElement = document.querySelector(targetSelector);if (targetElement) {targetElement.appendChild(el);} else {console.warn(`Target element "${targetSelector}" not found`);}},unmounted(el, binding) {const targetSelector = binding.value || 'body';const targetElement = document.querySelector(targetSelector);if (targetElement && targetElement.contains(el)) {targetElement.removeChild(el);}}
};

然后,在Vue 组件或主应用实例中注册这个自定义指令。

// main.js
import { createApp } from 'vue';
import App from './App.vue';
import teleportDirective from './teleportDirective';const app = createApp(App);app.directive('teleport', teleportDirective);app.mount('#app');

最后,在组件中使用这个自定义指令。

<template><div v-teleport="'#target-container'">This content will be teleported</div>
</template><script>
export default {name: 'MyComponent'
};
</script><!-- 目标容器 -->
<div id="target-container"></div>

解释

  1. 指令绑定值

    • binding.value 是指令的绑定值。在这个例子中,我们使用了一个选择器字符串(如 '#target-container')来指定目标元素。
  2. 挂载时的操作

    • mounted 钩子中,我们通过 document.querySelector 找到目标元素,并将指令绑定的元素(el)追加到目标元素中。
  3. 卸载时的操作

    • unmounted 钩子中,我们确保在目标元素中删除这个元素,以防内存泄漏。

通过这种方式,可以将元素移动到指定的 DOM 位置,类似于 <teleport> 组件的功能。这种自定义指令的方法提供了更多的灵活性,但在大多数情况下,使用 Vue 内置的 <teleport> 组件会更简单和可靠。


这样简洁很多了,不需要再套一层😁😁😁

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/721939.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android实现列表ListView

首先是创建一个基础的item组件<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="mat…

kettle从入门到精通 第六十六课 ETL之kettle kettle阻塞教程,轻松获取最后一行数据,so easy

场景:ETL沟通交流群内有小伙伴反馈,如何在同步一批数据完成之后记录下同步结果呢?或者是调用后续步骤、存储过程、三方接口等。 解决:使用步骤Blocking step进行阻塞处理即可。 1、下面的demo演示从表t1同步数据至表t2(t1表中有三条数据,t2为空表,两个表表结构相同),然…

第二轮PTA作业

前言:在这学期的Java学习了一段时间,相比于之前,在语法和面向对象的思想上比之前了解更多,在能力培养上也是更上一层楼,做了很多的复杂的题,虽然结果不尽人意,但是进行了不断思考和试错的过程,使我在设计层面上受益匪浅。 PTA第四次作业的最后一题 7-1 答题判题程序-4 …

设备树下的 LED 驱动实验

设备树下的 LED 驱动实验 本章实验重点内容如下: ①、在 imx6ull-alientek-emmc.dts 文件中创建相应的设备节点。 ②、编写驱动程序(在第四十二章实验基础上完成),获取设备树中的相关属性值。 ③、使用获取到的有关属性值来初始化 LED 所使用的 GPIO。 设备树文件添加设备节点…

偶函数在零点的泰勒展开式相关知识点

步骤1: 理解偶函数的定义偶函数是指满足 f(x)=f(−x)f(x) = f(-x)f(x)=f(−x) 的函数。这意味着偶函数关于 yyy 轴对称。步骤2: 理解泰勒展开泰勒展开是一种将函数表示为无穷级数的方法,它在函数在某一点的所有导数都存在的情况下非常有效。对于函数 f(x)f(x)f(x) 在零点的泰勒…

三探堆栈欺骗之Custom Call Stacks

本文首发阿里云先知社区:https://xz.aliyun.com/t/14592 背景知识 在之前的文章中,我们介绍了静态欺骗和动态欺骗堆栈,今天我们来一起学习一下另一种技术,它被它的作者称为Custom Call Stacks,即自定义堆栈调用。 关于堆栈欺骗的背景我们就不再说了,这里我们补充一下回调函…

esphome esp8266刷写遇到的问题

问题描述: 在尝试打开串口时出现以下错误信息: Failed to execute open on SerialPort: Failed to open serial port.起因: 莫名其妙地安装了一个乐鑫的新版 CH340 驱动。解决方案:找到正确的驱动程序,如下图所示:卸载安装的新驱动,并等待系统自动安装正确的驱动。

数字滤波器和模拟滤波器(一)

下面介绍模拟滤波器和数字滤波器的频率响应的异同,以及如何使用python地`scipy.signal`来绘制其频谱响应和冲激阶跃响应。在第二期将谈到如何设计模拟滤波器和数字滤波器。模拟滤波器和数字滤波器(一) 下面介绍模拟滤波器和数字滤波器的频率响应的异同,以及如何使用python地…

茗鹤 | 模具如何在APS高级计划排程系统中,配置共模、互换镶件等有限约束条件?

在高度依赖模具的生产环境中,模具管理与APS生产排程的有效整合是提升效率、确保订单交期的关键。以下是针对模具管理的几个核心策略,通过APS高级计划排程系统的辅助,实现产能优化与生产调度的智能化升级在高度依赖模具的生产环境中,模具管理与APS生产排程的有效整合是提升效…

靶机练习:Gitroot

信息收集 扫描全端口以发现服务访问80端口,有hint尝试绑定域名到/etc/vuln,同时提示中存在用户名jen,可以尝试爆破ssh 绑定后能访问站点了用wpscan能扫出wordpress的用户名接下来没爆破出密码 尝试使用wfuzz扫描子域名 wfuzz -c -u http://gitroot.vuln -H "HOST:FUZZ.…

Redis-10-分布式锁.md

参考: 分布式锁介绍 1.概念 额,为什么的话,建议先了解下我这篇文章。 Java-并发-并发的基本概念 我们在并发场景下,区分一个场景是否有并发问题,个人理解,锁的场景需要考虑:共享:是否共享某个资源 竞态:如何构建竞态关系首先,我们得拎清楚它到底会不会共享,不是说多…