Vue3:<Teleport>传送门组件的使用和注意事项

news/2024/9/17 9:35:15/ 标签: vue.js, 前端, 面试

你好,我是沐爸,欢迎点赞、收藏、评论和关注。

Vue3 引入了一个新的内置组件 <Teleport>,它允许你将子组件树渲染到 DOM 中的另一个位置,而不是在父组件的模板中直接渲染。这对于需要跳出当前组件的 DOM 层级结构进行渲染的场景非常有用,比如模态框(Modal)、下拉菜单(Dropdown)或者工具提示(Tooltip)等组件,这些组件通常需要在页面上的特定位置显示,而不是它们被声明的地方。

一、基本用法

<template><div><!-- 默认传送到 body 中 --><Teleport><p>This will be rendered in the body element.</p></Teleport><!-- 指定传送到特定的 DOM 元素 --><Teleport to="#custom-element"><p>This will be rendered in the #custom-element.</p></Teleport></div>
</template><script>
export default {// ...
};
</script><style>
/* 样式 */
</style>

在这个示例中,第一个 <Teleport> 组件将 <p> 元素默认传送到 body 元素中。第二个 <Teleport> 组件将 <p> 元素传送到 ID 为 custom-element 的 DOM 元素中。

二、指定传送目标

你可以使用 `to` 属性来指定传送的目标元素。如果 `to` 属性是一个字符串,它将被视为 CSS 选择器来查找目标元素。你也可以直接传递一个 DOM 元素作为 `to` 属性的值。
<template><div><Teleport :to="targetElement"><p>This will be rendered in the target element.</p></Teleport></div>
</template><script>
export default {data() {return {targetElement: null};},mounted() {this.targetElement = document.querySelector('#custom-element');}
};
</script>

在这个示例中,<Teleport> 组件将 <p> 元素传送到 mounted 钩子中指定的 targetElement 中。

三、动态传送目标

你可以动态地改变 `to` 属性的值,以在不同目标之间切换传送的内容。
<template><div><button @click="changeTarget">Change Target</button><Teleport :to="target"><p>This will be rendered in the target element.</p></Teleport></div>
</template><script>
export default {data() {return {target: 'body'};},methods: {changeTarget() {this.target = this.target === 'body' ? '#custom-element' : 'body';}}
};
</script>

在这个示例中,点击按钮会切换 <Teleport> 组件的目标,将 <p> 元素在 body#custom-element 之间传送。

四、搭配组件使用

`` 只改变了渲染的 DOM 结构,它不会影响组件间的逻辑关系。也就是说,如果 ``包含了一个组件,那么该组件始终和这个使用了``的组件保持逻辑上的父子关系。传入的 props 和触发的事件也会照常工作。

这也意味着来自父组件的注入也会按预期工作,子组件将在 Vue Devetools 中嵌套在父组件下面,而不是放在实际内容移动到的地方。

五、禁用 Teleport

在某些场景下可能需要视情况禁用 ``。举例来说,我们想要在桌面端将一个组件当做浮层来渲染,但在移动端则当作行内组件。我们可以通过对 ``动态传入一个 `disabled`prop 来处理这两种不同情况。
<Teleport :disabled="isMobile">...
</Teleport>

这里的 isMobile的值为 true 时,<Teleport>会被禁用。

注意,**<Teleport>**被禁用后,**<Teleport>****组件中的内容将作为当前组件的一部分被渲染,而不再被传送。**举例来看,假如有以下代码:

index.html

<div id="app"></div>
<div id="modals"><div>模态框</div>
</div>

App.vue

<template><div class="parent"><h3>父组件</h3><child-component></child-component></div> 
</template>

ChildComponent.vue

<template><div class="child"><h3>子组件</h3></div><Teleport to="#modals"><div>A</div></Teleport><Teleport to="#modals"><div>B</div></Teleport>
</template>

Teleport组件未禁用之前的效果如下:

修改Teleport组件,将其禁用

ChildComponent.vue

<template><div class="child"><h3>子组件</h3></div><Teleport to="#modals" :disabled="true"><div>A</div></Teleport><Teleport to="#modals"><div>B</div></Teleport>
</template>

效果如下:

六、多个 Teleport 共享目标

一个可重用的模态框组件可能同时存在多个实例。对于此类场景,多个 `Teleport`组件可以将其内容挂载到同一个目标元素上,而顺序就是简单的顺次追加,后挂载的将排在目标元素下更后面的位置上。

比如下面这样的用例:

<Teleport to="#modals"<div>A</div>
</Teleport><Teleport to="#modals"><div>B</div>
</Teleport>

渲染的结果为:

<div id="modals><div>A</div><div>B</div>
</div>

七、注意事项

当使用 `` 时,请确保目标 DOM 元素(即 `to` 属性指定的元素)在组件渲染之前就已经存在于页面上。如果目标元素不存在,Vue 将不会渲染 `` 的内容,同时控制台会报警告。

警告如下:

[Vue warn]: Failed to locate Teleport target with selector “#modals”. Note the target element must exist before the component is mounted - i.e. the target cannot be rendered by the component itself, and ideally should be outside of the entire Vue component tree.

还是以模态框为例,代码如下:

App.vue

<template><div class="parent"><h3>父组件</h3><child-component></child-component></div> 
</template>

ChildComponent.vue

<template><div class="child"><h3>子组件</h3></div><Teleport to="#modals"><div>A</div></Teleport>
</template>

效果如下:

解决方案是,确保这个元素在 Teleport组件被渲染之前存在于 DOM 中。如果是在单页面应用(SPA)中,可能需要在 Vue 实例挂载之前确保该元素存在。例如,在使用 Vue CLI 创建的项目中,你可以在 index.html 文件中添加如下代码来确保 “#modals” 容器存在:

index.html

<div id="app"></div>
<div id="modals"><div>模态框</div>
</div>

<Teleport> 组件是 Vue 3 中一个非常强大的功能,它提供了一种灵活的方式来控制组件的渲染位置,使得组件的布局更加灵活和动态。

好了,分享结束,谢谢点赞,下期再见。


http://www.ppmy.cn/news/1522885.html

相关文章

算法:判断一个整数是不是2的阶次方

一、思路 核心&#xff1a;不断除以2&#xff0c;缩小判断的范围 判断整数除以2的余数是否为0&#xff0c;如果不为0&#xff0c;则直接返回false&#xff1b;如果为0&#xff0c;则将将整数除以2后重复本步骤。 注意&#xff1a; 1为2的0次幂。 二、代码 public class Numb…

第十章 【后端】环境准备(10.2)——Maven

10.2 Maven Maven 官网:https://maven.apache.org/ Maven 仓库:https://mvnrepository.com/ 下载 解压 在非系统盘上创建仓库目录 如:E:\maven-repository 修改配置 配置文件为 Maven 目录的 conf\settings.xml,修改为: <?xml version="1.0" encoding=&qu…

25版王道数据结构课后习题详细分析 第八章 8.5 归并排序、基数排序和计数排序

一、单项选择题 ———————————————————— ———————————————————— 解析&#xff1a;我们知道插入排序不能保证在一趟排序结束后一定有元素放在最终位置上。事实上&#xff0c;归并排序也不能保证。例如&#xff0c;序列{6,5,7,8,2,1,4,3}…

【Linux 从基础到进阶】Redis缓存服务安装与调优

Redis缓存服务安装与调优 引言 Redis 是一个开源的内存数据结构存储系统,广泛应用于缓存、会话管理和实时分析等场景。它支持多种数据结构,如字符串、哈希、列表、集合和有序集合,因其高性能和灵活性,成为开发者的首选缓存解决方案。本文将介绍如何在 CentOS 和 Ubuntu 系…

Python | Leetcode Python题解之第387题字符串中的第一个唯一字符

题目&#xff1a; 题解&#xff1a; class Solution:def firstUniqChar(self, s: str) -> int:position dict()q collections.deque()n len(s)for i, ch in enumerate(s):if ch not in position:position[ch] iq.append((s[i], i))else:position[ch] -1while q and po…

Kubernetes学习指南:保姆级实操手册05——配置集群HA负载均衡

五、Kubernetes学习指南&#xff1a;保姆级实操手册05——配置集群HA负载均衡 简介&#xff1a; Keepalived 提供 VRRP 实现&#xff0c;并允许您配置 Linux 机器使负载均衡&#xff0c;预防单点故障。HAProxy 提供可靠、高性能的负载均衡&#xff0c;能与 Keepalived 完美配合…

uniapp如何监听页面滚动?

在uni-app中&#xff0c;监听页面滚动主要通过在页面的.vue文件中的onPageScroll生命周期函数来实现。onPageScroll函数会在页面滚动时触发&#xff0c;你可以在这个函数中获取到当前页面的滚动位置等信息。 下面是一个简单的示例&#xff0c;展示了如何在uni-app中监听页面滚…

解决docker启动失败的错误“Status: unknown flag: --graph”

最近服务器重启以后docker启动失败了&#xff0c;使用以下命令查看 Docker 的日志文件以获取更详细的错误信息。 journalctl -u docker.service -e 9月 05 10:50:06 iZj6c94a19bsvkhti6zw6oZ dockerd[4379]: Status: unknown flag: --graph 9月 05 10:50:06 iZj6c94a19bsvkhti…

C++音视频开发笔记目录

目录 &#x1f315;基础知识&#x1f319;详解FFmpeg&#x1f319;播放音视频时发生了什么&#xff1f; & 视频的编解码 & H264是什么&#xff1f; & MP4是什么&#xff1f; &#x1f315;流媒体环境搭建&#x1f319;windows安装FFMpeg&#x1f319;docker一键部署…

Oracle SQL Developer:数据库开发与数据管理的利器

在数据库管理和开发领域&#xff0c;拥有一个强大而灵活的工具是至关重要的。Oracle SQL Developer 是 Oracle 公司提供的一个免费集成开发环境&#xff0c;它专为数据库开发、管理和数据建模而设计。本文将详细介绍 Oracle SQL Developer 的功能、特点以及如何使用它来执行数据…

面试真题 | 记录一次面试真题

一、基本问题(80%) 1、const 和 static 的作用: const(常量): 用于定义常量值,保证变量不可被修改。在函数参数中使用const可以保证函数内不会修改参数值。用于定义常量成员函数,表明该成员函数不会修改对象的状态。可以与指针一起使用,如const int*表示指针指向的值不…

单项链表的原地反转

逻辑图如下所示&#xff1a; 只需要将需要反转的节点放到头节点位置即可&#xff0c; 使用两个指针一个指针指向需要反转的节点&#xff0c;另一个指针指向需要反转的指针的前驱节点&#xff08;其实也就是元链表的头节点&#xff09; 操作过程&#xff1a; 1 2 3 4 5 2 1 …

Base x DAOBase: Base生态聚会新加坡站,共筑链上未来

备受期待的 Base 社区聚会将于新加坡 Token2049 期间盛大举行&#xff0c;这为 Base 的支持者和生态建设者们提供了一个绝佳的相聚机会。本次活动由 Base、 DAOBase以及其他合作方共同支持。Base 是全球知名交易所 Coinbase 研发的以太坊 Layer2 扩容方案&#xff0c;致力于为用…

html css js 编程简单实现 随机抽奖 练习小项目

我们经常在某些网站上 看到一些 抽奖的活动&#xff0c;比如大转盘 随机抽奖 这种抽奖程序是怎么实现的呢&#xff1f;下面分享一个代码 简单的 实现了一下 随机抽奖的逻辑 对于网页的 美观度 就不分享了 主要是分享 js怎么 随机的 让 奖品滚顶起来 然后 某个节点 停止滚动 从而…

JavaWeb后端开发总结(3)

AOP基础 AOP概述 首先我们要知道AOP是什么&#xff1f; 看下图 个人解析&#xff1a; AOP叫做面向切面编程&#xff0c;但是实际上就是面向方法编程 图中下面一部分是一个AOP的案例 AOP快速入门案例代码实现 案例&#xff1a;测出业务中各个业务方法所需的执行时间 如果…

冒泡排序算法介绍

冒泡排序算法介绍 如果真的累了&#xff0c;就拉上窗帘关上手机关掉闹钟深呼吸一口气钻进被窝&#xff0c;好好地睡一觉&#xff0c;难熬的日子总需要一些温暖&#xff0c;而什么都不如被窝的温暖来的踏实。 冒泡排序是一种经典的排序算法&#xff0c;它通过重复遍历待排序的序…

【机器学习-一-基础概念篇】

机器学习 定义分类算法 应用 定义 机器学习最早是被Arthur Samuel 提出的一个概念&#xff0c;指计算机无需明确编程即可学习的研究领域。1950年他发明的跳棋程序&#xff0c;这个人机对弈游戏让他的声名鹊起&#xff0c;机器学习这个概念才进入大众的是视线。 在这个跳棋程序…

智能合约漏洞(四)

前言 在前面的文章中&#xff0c;我们讨论了整数溢出/下溢和时间依赖漏洞。今天&#xff0c;我们将继续探讨智能合约中两种常见的安全问题&#xff1a;拒绝服务&#xff08;Denial of Service, DoS&#xff09;和恶意合约依赖漏洞。这些漏洞可能导致合约功能的中断或意外的恶意…

机器学习引领未来:赋能精准高效的图像识别技术革新

图像识别技术近年来取得了显著进展,深刻地改变了各行各业。机器学习,特别是深度学习的突破,推动了这一领域的技术革新。本文将深入探讨机器学习如何赋能图像识别技术,从基础理论到前沿进展,再到实际应用与挑战展望,为您全面呈现这一领域的最新动态和未来趋势。 1. 引言 …

windows下安装并使用nvm

目录 一.准备工作&#xff1a;卸载node 卸载步骤 二.下载nvm 三.安装nvm 三.配置下载源【重要】 四.使用nvm安装node.js 五.nvm常用命令 六.卸载nvm 一.准备工作&#xff1a;卸载node 如果电脑上已经有node&#xff0c;那么我们需要先完全卸载node&#xff0c;再安装…