Vue.js 学习总结(8)—— Vue 3 的 Teleport 特性,让你实现跨组件传输内容

什么是 Teleport?

在 Vue 3 中,Teleport 是一个新的内置组件,它允许你将子组件或 DOM 元素渲染到指定的 DOM 节点之外。简而言之,你可以将某个组件“传送”到另一个地方,而不必让它们局限于父组件的 DOM 树结构中。

为什么需要 Teleport?

在实际开发中,我们可能会遇到一些场景,需要将某些元素(如模态框、工具提示、通知等)渲染到特定的 DOM 节点之外。例如,模态框通常需要被渲染到 body 标签下,而不是嵌套在某个父组件内。这种情况下,Teleport 就派上用场了。

环境准备

在开始之前,请确保你已经安装了 Node.js 和 Vue CLI。如果没有,请参考以下链接进行安装:

  • Node.js 官方网站

  • Vue CLI 安装指南

创建 Vue 3 项目

首先,使用 Vue CLI 创建一个新的 Vue 3 项目。在终端中执行以下命令:

vue create teleport-demo

在提示中选择 Vue 3 版本。项目创建完成后,进入项目目录:

cd teleport-demo

使用 Teleport 实现跨组件传输内容

步骤一:创建模态框组件

在 src/components 目录下创建一个名为 Modal.vue 的文件。这个组件将包含模态框的内容和样式:

<template><div class="modal-overlay"><div class="modal-content"><slot></slot><button @click="$emit('close')">Close</button></div></div>
</template><script>
export default {name: 'Modal'
};
</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;
}.modal-content {background: white;padding: 20px;border-radius: 8px;
}
</style>

步骤二:在 App.vue 中使用 Teleport

打开 src/App.vue 文件,编辑模板部分以使用 Teleport 功能:

<template><div id="app"><button @click="showModal = true">Open Modal</button><teleport to="body"><modal v-if="showModal" @close="showModal = false"><h1>Hello Teleport!</h1><p>This content is teleported to the body element.</p></modal></teleport></div>
</template><script>
import Modal from './components/Modal.vue';export default {name: 'App',components: {Modal},data() {return {showModal: false};}
};
</script>

步骤三:运行项目

回到终端,运行以下命令启动开发服务器:

npm run serve

打开浏览器,访问 http://localhost:8080,你将看到一个按钮。点击按钮,模态框将显示,并且它被渲染到 body 标签下,而不是嵌套在父组件内。

深入理解 Teleport

teleport 指令详解

在 App.vue 中,使用 teleport 指令将 Modal 组件“传送”到 body 标签。这是 teleport 指令的基本用法:

<teleport to="body"><modal v-if="showModal" @close="showModal = false"><h1>Hello Teleport!</h1><p>This content is teleported to the body element.</p></modal>
</teleport>
to 属性
  • to 属性指定了目标 DOM 节点的选择器。在这个例子中,to="body" 表示将内容传送到 body 标签下。

  • 你也可以指定其他选择器,例如 #modal-root,前提是目标节点在 DOM 中已经存在。

动态目标节点

你可以动态地改变 teleport 的目标节点。例如,如果你希望根据条件将内容传送到不同的节点,可以这样做:

<template><div id="app"><button @click="showModal = true">Open Modal</button><teleport :to="modalTarget"><modal v-if="showModal" @close="showModal = false"><h1>Hello Dynamic Teleport!</h1><p>This content is teleported dynamically.</p></modal></teleport></div>
</template><script>
import Modal from './components/Modal.vue';export default {name: 'App',components: {Modal},data() {return {showModal: false,modalTarget: 'body'  // 目标节点可以是动态的};}
};
</script>

Teleport 的高级用法

多个 Teleport

你可以在一个组件中使用多个 teleport 指令,将不同的内容传送到不同的目标节点。例如:

<template><div id="app"><button @click="showModal = true">Open Modal</button><teleport to="body"><modal v-if="showModal" @close="showModal = false"><h1>Modal in Body</h1></modal></teleport><teleport to="#another-target"><div v-if="showModal"><p>Another content teleported to #another-target</p></div></teleport></div>
</template>

确保在 HTML 文件中添加 #another-target 节点:

<body><div id="app"></div><div id="another-target"></div>
</body>

条件 Teleport

有时,你可能需要根据条件来决定是否使用 teleport。你可以通过条件渲染来实现这一点:

<template><div id="app"><button @click="showModal = true">Open Modal</button><component :is="useTeleport ? 'teleport' : 'div'" to="body"><modal v-if="showModal" @close="showModal = false"><h1>Conditionally Teleported</h1></modal></component></div>
</template><script>
import Modal from './components/Modal.vue';export default {name: 'App',components: {Modal},data() {return {showModal: false,useTeleport: true  // 条件决定是否使用 teleport};}
};
</script>

与 Vue Router 配合

当使用 Vue Router 时,你可能需要在不同的路由间共享某些内容(如模态框)。你可以利用 Teleport 实现这一点,而无需在每个路由组件中重复代码。例如:

<template><div id="app"><router-view></router-view><teleport to="body"><modal v-if="showModal" @close="showModal = false"><h1>Modal shared across routes</h1></modal></teleport></div>
</template><script>
import Modal from './components/Modal.vue';export default {name: 'App',components: {Modal},data() {return {showModal: false};},methods: {openModal() {this.showModal = true;},closeModal() {this.showModal = false;}}
};
</script>

然后在路由组件中调用 openModal 方法来打开模态框:

<template><div><h1>Home Page</h1><button @click="$emit('openModal')">Open Modal</button></div>
</template><script>
export default {name: 'Home',methods: {openModal() {this.$emit('openModal');}}
};
</script>

确保在 App.vue 中监听 openModal 事件:

<template><div id="app"><router-view @openModal="openModal"></router-view><teleport to="body"><modal v-if="showModal" @close="closeModal"><h1>Modal shared across routes</h1></modal></teleport></div>
</template><script>
import Modal from './components/Modal.vue';export default {name: 'App',components: {Modal},data() {return {showModal: false};},methods: {openModal() {this.showModal = true;},closeModal() {this.showModal = false;}}
};
</script>

Teleport 的注意事项

性能考虑

虽然 Teleport 非常强大,但在使用时需要注意性能问题。特别是当你传送大量的内容或频繁地进行传送操作时,可能会影响性能。因此,务必在实际项目中合理使用 Teleport。

SEO 考虑

如果你正在开发一个需要 SEO 的项目,需要注意 Teleport 的内容可能不会立即被搜索引擎抓取。确保 Teleport 的内容对于 SEO 不至关重要,或者使用其他方式确保内容的可爬取性。

事件监听

由于 Teleport 会将内容传送到其他 DOM 节点,确保事件监听器和数据绑定仍然正常工作。在传送内容时,检查相关功能是否如预期般工作。

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

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

相关文章

ReactRouter——路由配置、路由跳转、带参跳转、新route配置项

目录 写在前面 (一)初步使用router 1.安装react-router-dom 2.创建router结构 3.嵌套路由 4.配置not found页面 (1)确切路由报错页面 (2)未配置路由报错页面 5.重定向 (二)路由跳转 1.组件跳转 2.NavLink 3.js跳转 (三)传递参数 1.searchParams(query)参数 2…

这两款kimi和豆包插件,用来辅助文献阅读和总结,太香了!娜姐亲测好用

我是娜姐 迪娜学姐 &#xff0c;一个SCI医学期刊编辑&#xff0c;探索用AI工具提效论文写作和发表。 ChatGPT刚出来的时候&#xff0c;几款速读PDF的AI工具ChatDoc、ChatPDF也跟着火了起来&#xff0c;可见大家对于速读文献、总结文档需求很高。 我记得ChatPDF只有几次免费机会…

Follow Carl To Grow|【LeetCode】654.最大二叉树,617.合并二叉树,700.二叉搜索树中的搜索,98.验证二叉搜索树

【LeetCode】654.最大二叉树 题意&#xff1a;给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点&#xff0c;其值为 nums 中的最大值。 递归地在最大值 左边 的 子数组前缀上 构建左子树。 递归地在最大值 右边 的 子数组后缀…

2024.6.9 七

Python的time库 先导入库 import time相关函数 time.time() 返回当前时间的时间戳(一个记录时间的浮点数),从1970年开始算的 time.localtime(sec) 返回一个指定时间戳(sec)的struct_time对象,是一个元组封装起来的,默认是当地时间 struct_time对象 tm_year 年 tm_mon 月 tm_…

opencv--使用opencv实现旋转角度的模板匹配

下面的例子是简单的使用opencv 实现的模板匹配流程&#xff0c;其中时间性能和精确度还需要调整&#xff0c;如果直接使用会出问题&#xff0c;所以这个只是例子&#xff0c;根据代码原理可以实现尺度变化的模板匹配和旋转尺度变化同时&#xff0c;具体根据实现的旋转代码进一步…

Nacos的配置中心

1.前言 除了注册中心和负载均衡之外, Nacos还是⼀个配置中心, 具备配置管理的功能. Namespace 的常用场景之一是不同环境的配置区分隔离&#xff0c; 例如开发测试环境和⽣产环境的配置隔离。 1.1 为什么需要配置中心&#xff1f; 当前项目的配置都在代码中&#xff0c;会存…

Django 部署指南

部署 Django 应用程序涉及将我们的应用程序从开发环境部署到生产环境&#xff0c;并确保它可以在生产服务器上安全运行和扩展。其实了解几种部署方案&#xff0c;相信你对将来的项目更得心应手。 1、问题背景 Django 是一款流行的 Python Web 框架&#xff0c;但对于新手来说&…

elasticsearch hanlp 插件安装操作

elasticsearch hanlp 插件安装操作 下载 hanlp 插件上传hanlp插件到elasticsearch服务器安装hanlp插件kibana测试 下载 hanlp 插件 这里大家根据自己对应的 elasticsearch 版本下载匹配版本的 hanlp 插件&#xff0c;由于 hanlp 及 elasticsearch 各个版本之间差别较大&#x…

将克隆到本地的6.824项目上传到自己的github

前置知识见&#xff1a;把自己在本地完成的mit6.s081项目上传到自己的github仓库里_mit6.s081 lab上传-CSDN博客 先在github建立一个自己的仓库 由于github可以给自己的主分支改名了&#xff0c;我这次是勾选了创建README文件 在本地同样是建立一条remote分支 git remote add…

Ant Design Vue Table组件全单元格编辑实现方案

在ant上的table常见用法是一行的元素可编辑&#xff0c;如下&#xff1a; 但是现在有一个需求是全部单元格均可编辑&#xff0c;如何实现呢&#xff1f; 表格组件 <a-tablev-if"query.personnel_type 0"size"middle"row-key"id":scroll&qu…

web前端分离:解析其深层含义与影响

web前端分离&#xff1a;解析其深层含义与影响 在现今的web开发领域&#xff0c;前端分离已经成为一个不可忽视的趋势。那么&#xff0c;web前端分离究竟意味着什么呢&#xff1f;本文将从四个方面、五个方面、六个方面和七个方面&#xff0c;深入剖析其内涵&#xff0c;并探讨…

【CS.OS】操作系统如何使用分页和分段技术管理内存

1000.5.CS.OS.1.3-基础-内存管理-操作系统如何使用分页和分段技术管理内存-Created: 2024-06-09.Sunday10:24 操作系统的内存管理是一个复杂而关键的功能&#xff0c;它确保了程序可以高效、安全地运行。虚拟内存管理是其中一个重要的概念&#xff0c;它通过分页和分段技术来实…

Leetcode刷题笔记8

162. 寻找峰值 162. 寻找峰值 - 力扣&#xff08;LeetCode&#xff09; 对于所有有效的 i 都有 nums[i] ! nums[i 1] 解法一&#xff1a;暴力解法 从第一个位置一直向后走&#xff0c;然后分情况即可1. 第二个元素就往下降&#xff0c;那么第一个元素就是峰顶 2. 一直遍历…

温度传感器十大品牌

温度传感器品牌排行榜-十大热电偶品牌-热敏电阻品牌排行-Maigoo品牌榜

【Vue】获取模块内的mutations方法

目标&#xff1a; 掌握模块中 mutation 的调用语法 注意&#xff1a; 默认模块中的 mutation 和 actions 会被挂载到全局&#xff0c;需要开启命名空间&#xff0c;才会挂载到子模块。 调用方式&#xff1a; 直接通过 store 调用 $store.commit(模块名/mutations名 , 额外…

k8s面试题大全,保姆级的攻略哦(三)

目录 1、简述ETCD及其特点? 2、简述ETCD适应的场景? 3、简述什么是Kubernetes? 4、简述Kubernetes和Docker的关系? 5、简述Kubernetes中什么是Minikube、Kubectl、Kubelet? 6、简述Kubernetes常见的部署方式? 7、简述Kubernetes如何实现集群管理? 8、简述Kubern…

卷积 - 感受野(Receptive Field)

卷积 - 感受野&#xff08;Receptive Field&#xff09; flyfish 感受野&#xff08;Receptive Field&#xff09;是指卷积神经网络中某一层的一个特定神经元能够“看到”并响应的输入图像区域。简单来说&#xff0c;它是指卷积核在输入图像上滑动过程中每次覆盖的区域。感受…

09-Eureka-搭建eureka服务

09-Eureka-搭建eureka服务 1.动手实践&#xff1a; 1.搭建EurekaServer 2.将user-service、order-service都注册到Eureka 3.在order-service中完成服务拉取&#xff0c;然后通过负载均衡挑选一个服务&#xff0c;实现远程调用 2.搭建EurekaServer服务步骤如下&#xff1a; 1.…

【设计模式】结构型设计模式之 组合模式

介绍 这里的组合模式&#xff0c;与之前的设计模式中的"组合关系"完全是两码事&#xff0c;这里的组合模式主要用来处理结构为树形的数据。 组合模式&#xff08;Composite Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许你将对象组合成树状结构来表示…