当前位置: 首页 > article >正文

vue3中Teleport的用法以及使用场景

1. 基本概念

Teleport 是 Vue3 提供的一个内置组件,它可以将组件的内容传送到 DOM 树的任何位置,而不受组件层级的限制。这在处理模态框、通知、弹出菜单等需要突破组件层级限制的场景中特别有用。

1.1 基本语法

<template><teleport to="body"><!-- 这里的内容会被传送到 body 标签下 --><div class="modal"><!-- 模态框内容 --></div></teleport>
</template>

2. 常见使用场景

2.1 模态框

<!-- Modal.vue -->
<template><teleport to="body"><div v-if="isOpen" class="modal-overlay"><div class="modal"><div class="modal-header"><h3>{{ title }}</h3><button @click="close">×</button></div><div class="modal-body"><slot></slot></div><div class="modal-footer"><slot name="footer"><button @click="close">关闭</button></slot></div></div></div></teleport>
</template><script setup>
const props = defineProps({isOpen: Boolean,title: String
})const emit = defineEmits(['update:isOpen'])const close = () => {emit('update:isOpen', false)
}
</script><style scoped>
.modal-overlay {position: fixed;top: 0;left: 0;width: 100%;height: 100%;background: rgba(0, 0, 0, 0.5);display: flex;justify-content: center;align-items: center;z-index: 1000;
}.modal {background: white;padding: 20px;border-radius: 8px;min-width: 300px;
}
</style>

2.2 通知提示

<!-- Notification.vue -->
<template><teleport to="#notifications-container"><divv-if="show":class="['notification', type]"@click="close"><div class="notification-content">{{ message }}</div></div></teleport>
</template><script setup>
import { ref, onMounted } from 'vue'const props = defineProps({message: String,type: {type: String,default: 'info'},duration: {type: Number,default: 3000}
})const show = ref(true)const close = () => {show.value = false
}onMounted(() => {if (props.duration > 0) {setTimeout(close, props.duration)}
})
</script><style scoped>
.notification {position: fixed;top: 16px;right: 16px;padding: 12px 24px;border-radius: 4px;cursor: pointer;transition: all 0.3s;
}.info {background: #e6f7ff;border: 1px solid #91d5ff;
}.success {background: #f6ffed;border: 1px solid #b7eb8f;
}.error {background: #fff2f0;border: 1px solid #ffccc7;
}
</style>

2.3 上下文菜单

<!-- ContextMenu.vue -->
<template><teleport to="body"><divv-if="show"class="context-menu":style="position"><slot></slot></div></teleport>
</template><script setup>
import { ref, computed } from 'vue'const props = defineProps({show: Boolean,x: Number,y: Number
})const position = computed(() => ({left: props.x + 'px',top: props.y + 'px'
}))
</script><style scoped>
.context-menu {position: fixed;background: white;border: 1px solid #eee;border-radius: 4px;padding: 8px 0;min-width: 160px;box-shadow: 0 2px 12px rgba(0, 0, 0, 0.1);
}
</style>

3. 高级用法

3.1 动态目标

<template><teleport :to="target"><div class="content">动态传送的内容</div></teleport>
</template><script setup>
import { ref, onMounted } from 'vue'const target = ref('body')onMounted(() => {// 可以根据条件动态改变目标if (window.innerWidth < 768) {target.value = '#mobile-container'}
})
</script>

3.2 多个 Teleport 到同一目标

<template><teleport to="#notifications"><div class="notification">通知 1</div></teleport><teleport to="#notifications"><div class="notification">通知 2</div></teleport>
</template>

3.3 条件性传送

<template><teleport to="body" :disabled="isMobile"><div class="modal"><!-- 在移动端不会被传送,保持原位置 --></div></teleport>
</template><script setup>
import { ref, onMounted } from 'vue'const isMobile = ref(false)onMounted(() => {isMobile.value = window.innerWidth < 768window.addEventListener('resize', () => {isMobile.value = window.innerWidth < 768})
})
</script>

4. 实际应用示例

4.1 全局加载指示器

<!-- LoadingIndicator.vue -->
<template><teleport to="body"><div v-if="loading" class="loading-overlay"><div class="loading-spinner"></div><div class="loading-text">{{ message }}</div></div></teleport>
</template><script setup>
defineProps({loading: Boolean,message: {type: String,default: '加载中...'}
})
</script><style scoped>
.loading-overlay {position: fixed;top: 0;left: 0;width: 100%;height: 100%;background: rgba(255, 255, 255, 0.9);display: flex;flex-direction: column;justify-content: center;align-items: center;z-index: 9999;
}
</style>

4.2 图片预览器

<!-- ImageViewer.vue -->
<template><teleport to="body"><divv-if="visible"class="image-viewer"@click="close"><img:src="imageUrl"@click.stop><div class="controls"><button @click.stop="prev">&lt;</button><button @click.stop="next">&gt;</button></div></div></teleport>
</template><script setup>
const props = defineProps({visible: Boolean,imageUrl: String,images: Array
})const emit = defineEmits(['update:visible'])const close = () => {emit('update:visible', false)
}const prev = () => {// 实现上一张逻辑
}const next = () => {// 实现下一张逻辑
}
</script>

5. 最佳实践

5.1 目标元素管理

<!-- index.html -->
<!DOCTYPE html>
<html>
<head><title>Vue App</title>
</head>
<body><div id="app"></div><!-- 为 Teleport 预留的容器 --><div id="modals"></div><div id="notifications"></div><div id="tooltips"></div>
</body>
</html>

5.2 组件封装

<!-- BaseModal.vue -->
<template><teleport to="#modals"><transition name="modal"><divv-if="modelValue"class="modal-container"@click.self="close"><div class="modal-content"><slot></slot></div></div></transition></teleport>
</template><script setup>
defineProps({modelValue: Boolean
})const emit = defineEmits(['update:modelValue'])const close = () => {emit('update:modelValue', false)
}
</script>

6. 注意事项

  1. 目标元素存在性检查
<template><teleport to="#target" :disabled="!targetExists"><div>内容</div></teleport>
</template><script setup>
import { ref, onMounted } from 'vue'const targetExists = ref(false)onMounted(() => {targetExists.value = !!document.querySelector('#target')
})
</script>
  1. SSR 兼容性
<template><client-only><teleport to="body"><div>仅客户端渲染的内容</div></teleport></client-only>
</template>
  1. 清理工作
<script setup>
import { onUnmounted } from 'vue'onUnmounted(() => {// 确保清理所有传送的内容const target = document.querySelector('#target')if (target) {target.innerHTML = ''}
})
</script>

相关文章:

vue3中Teleport的用法以及使用场景

1. 基本概念 Teleport 是 Vue3 提供的一个内置组件&#xff0c;它可以将组件的内容传送到 DOM 树的任何位置&#xff0c;而不受组件层级的限制。这在处理模态框、通知、弹出菜单等需要突破组件层级限制的场景中特别有用。 1.1 基本语法 <template><teleport to&quo…...

LLM - 大模型 ScallingLaws 的指导模型设计与实验环境(PLM) 教程(4)

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/145323420 免责声明&#xff1a;本文来源于个人知识与公开资料&#xff0c;仅用于学术交流&#xff0c;欢迎讨论&#xff0c;不支持转载。 Scalin…...

【Linux网络编程】传输层协议

目录 一&#xff0c;传输层的介绍 二&#xff0c;UDP协议 2-1&#xff0c;UDP的特点 2-2&#xff0c;UDP协议端格式 三&#xff0c;TCP协议 3-1&#xff0c;TCP报文格式 3-2&#xff0c;TCP三次握手 3-3&#xff0c;TCP四次挥手 3-4&#xff0c;滑动窗口 3-5&#xf…...

salesforce 可以 outbound profile 吗

在 Salesforce 中&#xff0c;Profile&#xff08;配置文件&#xff09; 通常不能直接通过标准的Change Set&#xff08;变更集&#xff09; 或 Outbound Migration&#xff08;外部迁移工具&#xff09; 进行完整的迁移&#xff0c;但可以通过以下方法来实现部分或全部迁移&am…...

FreeRtos的使用教程

定义&#xff1a; RTOS实时操作系统, (Real Time Operating System), 指的是当外界事件发生时, 能够有够快的响应速度,调度一切可利用的资源, 控制实时任务协调一致的运行。 特点&#xff1a; 支持多任务管理&#xff0c; 处理多个事件&#xff0c; 实现更复杂的逻辑。 与计算…...

windows系统如何检查是否开启了mongodb服务

windows系统如何检查是否开启了mongodb服务&#xff01;我们有很多软件开发&#xff0c;网站开发时候需要使用到这个mongodb数据库&#xff0c;下面我们看看&#xff0c;如何在windows系统内排查&#xff0c;是否已经启动了本地服务。 在 Windows 系统上&#xff0c;您可以通过…...

windows蓝牙驱动开发-生成和发送蓝牙请求块 (BRB)

以下过程概述了配置文件驱动程序生成和发送蓝牙请求块 (BRB) 应遵循的一般流程。 BRB 是描述要执行的蓝牙操作的数据块。 生成和发送 BRB 分配 IRP。 分配BRB&#xff0c;请调用蓝牙驱动程序堆栈导出以供配置文件驱动程序使用的 BthAllocateBrb 函数。&#xff1b;初始化 BRB…...

基于Ubuntu交叉编译ZLMediaKit

一、确保基于虚拟机VMVare的Ubuntu能正常上网 1、设置WIFI硬件无线网卡上网 菜单栏的“编辑”->选择“虚拟网络编辑器”&#xff0c;在弹出的窗口中&#xff0c;点击桥接模式的VMnet0&#xff0c;然后在下方选择“桥接模式”&#xff0c;网卡下拉栏&#xff0c;选择你目前…...

【PyTorch][chapter 29][李宏毅深度学习]Fine-tuning LLM

参考&#xff1a; https://www.youtube.com/watch?veC6Hd1hFvos 目录&#xff1a; 什么是 Fine-tune 为什么需要Fine-tuning 如何进行Fine-tune Fine-tuning- Supervised Fine-tuning 流程 Fine-tuning参数训练的常用方案 LORA 简介 示例代码 一 什么是 Fine-tune …...

git回退

git回退 1、未使用 git add 缓存代码时 git checkout –- filepathname 放弃单个文件的修改 git checkout . 放弃所有的文件修改 此命令用来放弃掉所有还没有加入到缓存区&#xff08;就是 git add 命令&#xff09;的修改&#xff1a;内容修改与整个文件删除。但是此命令不…...

数字图像处理:实验七

uu们&#xff01;这是我们目前数字图像系列的最后一张&#xff0c;之后有关人工智能结合的数字图像处理咸鱼哥正在学习和创作中&#xff0c;所以还请大家给咸鱼哥点时间&#xff0c;同时也提前预祝大家2025年新春快乐&#xff01;&#xff08;咸鱼哥真诚的祝愿每一个人&#xf…...

网易前端开发面试题200道及参考答案 (下)

阐述如何实现 img 按照原比例最大化放置在 div 中? 要让 img 按照原比例最大化放置在 div 中,可通过以下几种方式实现: 使用 object - fit 属性 object - fit 是 CSS 中用于规定如何调整替换元素(如 <img>、<video>)的内容以适应其容器的属性。 object - fit…...

通义灵码插件保姆级教学-IDEA(安装及使用)

一、JetBrains IDEA 中安装指南 官方下载指南&#xff1a;通义灵码安装教程-阿里云 步骤 1&#xff1a;准备工作 操作系统&#xff1a;Windows 7 及以上、macOS、Linux&#xff1b; 下载并安装兼容的 JetBrains IDEs 2020.3 及以上版本&#xff0c;通义灵码与以下 IDE 兼容&…...

利用双指针一次遍历实现”找到“并”删除“单链表倒数第K个节点(力扣题目为例)

Problem: 19. 删除链表的倒数第 N 个结点 文章目录 题目描述思路复杂度Code 题目描述 思路 1.欲找到倒数第k个节点&#xff0c;即是找到正数的第n-k1、其中n为单链表中节点的个数个节点。 2.为实现只遍历一次单链表&#xff0c;我们先可以使一个指针p1指向链表头部再让其先走k步…...

2025美赛倒计时,数学建模五类模型40+常用算法及算法手册汇总

数学建模美赛倒计时&#xff0c;对于第一次参加竞赛且没有相关基础知识的同学来讲&#xff0c;掌握数学建模常用经典的模型算法知识&#xff0c;并熟练使用相关软件进行建模是关键。本文将介绍一些常用的模型算法&#xff0c;以及软件操作教程。 数学建模常用模型包括&#xf…...

sql中INNER JOIN、LEFT JOIN、RIGHT JOIN

INNER JOIN 的作用 INNER JOIN 只会将相关联表匹配到的数据进行展示 假设我们有两个表&#xff1a;sys_user和 sys_user_role SELECT s1.* from sys_user s1 INNER JOIN sys_user_role s2 on s1.id s2.user_id 这样只会展示s1.id s2.user_id相匹配到的数据&#xff0c;其他数…...

二十三种设计模式-享元模式

享元模式&#xff08;Flyweight Pattern&#xff09;是一种结构型设计模式&#xff0c;旨在通过共享相同对象来减少内存使用&#xff0c;尤其适合在大量重复对象的情况下。 核心概念 享元模式的核心思想是将对象的**可共享部分&#xff08;内部状态&#xff09;提取出来进行共…...

前端【10】jQuery DOM 操作

目录 jquery捕获查取 获得内容 - text()、html() 以及 val() 获取属性 - attr() ​编辑 jQuery 修改/设置内容和属性 设置内容 - text()、html() 以及 val() 设置属性 - attr() jQuery添加元素 jQuery - 删除元素 前端【9】初识jQuery&#xff1a;让JavaScript变得更简…...

Day34:字符串的替换

在 Python 中&#xff0c;字符串替换是一个非常常见的操作&#xff0c;主要用于修改字符串中的某些部分。字符串的替换操作通常不修改原始字符串&#xff0c;因为字符串在 Python 中是不可变的&#xff0c;而是返回一个新的字符串。 Python 提供了 str.replace() 方法来执行替…...

汇编的使用总结

一、汇编的组成 1、汇编指令&#xff08;指令集&#xff09; 数据处理指令: 数据搬移指令 数据移位指令 位运算指令 算术运算指令 比较指令 跳转指令 内存读写指令 状态寄存器传送指令 异常产生指令等 2、伪指令 不是汇编指令&#xff0c;但是可以起到指令的作用&#xff0c;伪…...

力扣【347. 前 K 个高频元素】Java题解(堆)

TopK问题&#xff0c;我们直接上堆。 首先遍历一次然后把各个数字的出现频率存放在哈希表中便于后面堆的操作。 因为是出现频率前 k 高&#xff0c;所以用小顶堆&#xff0c;当我们遍历的频率值大于堆顶值时就可以替换堆顶。 代码&#xff1a; class Solution {public int[] …...

【计算机网络】host文件

host文件的主要功能&#xff1a; 域名解析 本地映射&#xff1a;host文件的主要功能是将**域名映射到相应的 IP 地址**。当计算机需要访问一个网站或服务时&#xff0c;它会首先在 host文件中查找该域名对应的 IP 地址。如果在 host文件中找到了匹配的域名和 IP 地址映射&…...

git如何设置pull的时候有些文件不pull

在 Git 中&#xff0c;没有直接的方法在 git pull 时排除特定文件&#xff0c;但可以通过以下方式实现类似效果&#xff1a; 方法 1: 使用 .gitignore .gitignore 文件可以忽略未跟踪的文件&#xff0c;但对已跟踪的文件无效。如果你希望某些文件不被拉取&#xff0c;可以先将…...

第五节 MATLAB命令

本节的内容将提供常用的一些MATLAB命令。 在之前的篇章中我们已经知道了MATLAB数值计算和数据可视化是一个交互式程序&#xff0c;在它的命令窗口中您可以在MATLAB提示符“>>”下键入命令。 MATLAB管理会话的命令 MATLAB提供管理会话的各种命令。如下表所示&#xff1a;…...

性能测试丨JVM 性能数据采集

什么是JVM性能数据采集&#xff1f; JVM性能数据采集是指通过一些工具和技术采集与Java虚拟机相关的性能数据。这些数据包括但不限于内存使用、CPU使用、垃圾回收&#xff08;GC&#xff09;行为、线程活动等。合理地分析这些数据&#xff0c;可以帮助我们找出系统的瓶颈&…...

vue3 vue2区别

Vue 3 和 Vue 2 之间存在多个方面的区别&#xff0c;以下是一些主要的差异点&#xff1a; 1. 性能改进 Vue 3&#xff1a;在性能上有显著提升&#xff0c;包括更小的包体积、更快的渲染速度和更好的内存管理。Vue 2&#xff1a;性能相对较低&#xff0c;尤其是在大型应用中。…...

快速更改WampServer根目录php脚本

快速更改WampServer根目录php脚本 <?php // 配置文件地址 $apacheConfPath C:\Install\CTF\Wampserver\bin\apache\apache2.4.62.1\conf\httpd.conf; $apacheConfPath2 C:\Install\CTF\Wampserver\bin\apache\apache2.4.62.1\conf\extra\httpd-vhosts.conf; // 新根目录…...

金价高企需求疲软,周大福近三个月零售值下降14.2%

1月22日&#xff0c;周大福在港交所发布公告称&#xff0c;截至2024年12月31日止三个月&#xff08;第三季度&#xff09;&#xff0c;集团零售值下降14.2%。其中&#xff0c;中国内地市场零售值下降13.0%&#xff0c;香港及澳门市场零售值下降20.4%&#xff0c;其他市场零售值…...

想品客老师的第七天:闭包和作用域

闭包之前的内容写在这里 环境、作用域、回收 首先还是数据的回收问题&#xff0c;全局变量一般都是通过关闭页面回收的&#xff1b;而局部变量的值不用了&#xff0c;会被自动回收掉 像这种写在全局里的就不会被主动回收捏&#xff1a; let title 荷叶饭function fn() {ale…...

Web 代理、爬行器和爬虫

目录 Web 在线网页代理服务器的使用方法Web 在线网页代理服务器使用流程详解注意事项 Web 请求和响应中的代理方式Web 开发中的请求方法借助代理进行文件下载的示例 Web 服务器请求代理方式代理、网关和隧道的概念参考文献说明 爬虫的工作原理及案例网络爬虫概述爬虫工作原理 W…...