任意传送门——Teleport

Vue3 的组合式 API 以及基于 Proxy 响应式原理已经有很多文章介绍过了,除了这些比较亮眼的更新;
Vue3 还新增了一个内置组件:Teleport。这个组件的作用主要用来将模板内的 DOM 元素移动到其他位置。

为什么我们需要 Teleport

Teleport 是一种能够将我们的模板移动到 DOM 中 Vue app 之外的其他位置的技术,就有点像哆啦A梦的“任意门”

场景

modals,toast 等这样的元素,很多情况下,我们将它完全的和我们的 Vue 应用的 DOM 完全剥离,管理起来反而会方便容易很多

原因

原因在于如果我们嵌套在 Vue 的某个组件内部,那么处理嵌套组件的定位、z-index 和样式就会变得很困难

  • 另外,像 modals,toast 等这样的元素需要使用到 Vue 组件的状态(data 或者 props)的值
  • 这就是 Teleport 派上用场的地方。我们可以在组件的逻辑位置写模板代码,这意味着我们可以使用组件的 data 或 props。然后在 Vue 应用的范围之外渲染它

teleport (API)

  • to属性 --> string类型。需要 prop,必须是有效的查询选择器或 HTMLElement (如果在浏览器环境中使用)。指定将在其中移动 内容的目标元素
<!-- 正确 -->
<teleport to="#some-id" />
<teleport to=".some-class" />
<teleport to="[data-teleport]" />
<!-- 错误 -->
<teleport to="h1" />
<teleport to="some-string" />
  • disabled属性 --> boolean类型。此可选属性可用于禁用 的功能,这意味着其插槽内容将不会移动到任何位置,而是在你在周围父组件中指定了 的位置渲染。
<teleport to="#popup" :disabled="displayVideoInline"><video src="./my-movie.mp4">
</teleport>

注意:

这将移动实际的 DOM 节点,而不是被销毁和重新创建,并且它还将保持任何组件实例的活动状态。所有有状态的 HTML 元素 (即播放的视频) 都将保持其状态。

Teleport 组件使用

一个常见的场景是创建一个包含全屏模式的组件。在大多数情况下,你希望模态框的逻辑存在于组件中,但是模态框的快速定位就很难通过 CSS 来解决,或者需要更改组件组合。

考虑下面的 HTML 结构:

<body><div style="position: relative;"><h3>Tooltips with Vue 3 Teleport</h3><div><modal-button></modal-button></div></div>
</body>

让我们来看看 modal-button 组件:

该组件将有一个 button 元素来触发模态框的打开,以及一个带有 class .modal 的 div 元素,它将包含模态框的内容和一个用于自关闭的按钮。

const app = Vue.createApp({});app.component('modal-button', {template: `<button @click="modalOpen = true">Open full screen modal!</button><div v-if="modalOpen" class="modal"><div>I'm a modal! <button @click="modalOpen = false">Close</button></div></div>`,data() {return { modalOpen: false}}
})

当在初始的 HTML 结构中使用这个组件时,我们可以看到一个问题——模态框是在深度嵌套的 div 中渲染的,而模态框的 position:absolute 以父级相对定位的 div 作为引用。

Teleport 提供了一种干净的方法,允许我们控制在 DOM 中哪个父节点下渲染了 HTML,而不必求助于全局状态或将其拆分为两个组件。

让我们修改 modal-button 以使用 <teleport>,并告诉 Vue “Teleport 这个 HTML 到该‘body’标签”。

app.component('modal-button', {template: `<button @click="modalOpen = true">Open full screen modal! (With teleport!)</button><teleport to="body"><div v-if="modalOpen" class="modal"><div>I'm a teleported modal! (My parent is "body")<button @click="modalOpen = false">Close</button></div></div></teleport>`,data() {return { modalOpen: false}}
})

因此,一旦我们单击按钮打开模态框,Vue 将正确地将模态框内容渲染为 body 标签的子级。

与 Vue components 一起使用

如果 <teleport> 包含 Vue 组件,则它仍将是 父组件的逻辑子组件:

const app = Vue.createApp({template: `<h1>Root instance</h1><parent-component />`
})app.component('parent-component', {template: `<h2>This is a parent component</h2><teleport to="#endofbody"><child-component name="John" /></teleport>`
})app.component('child-component', {props: ['name'],template: `<div>Hello, {{ name }}</div>`
})

在这种情况下,即使在不同的地方渲染 child-component,它仍将是 parent-component 的子级,并将从中接收 name prop。

这也意味着来自父组件的注入会正常工作,在 Vue Devtools 中你会看到子组件嵌套在父组件之下,而不是出现在他会被实际移动到的位置。

在同一目标上使用多个 teleport

一个常见的用例场景是一个可重用的 组件,它可能同时有多个实例处于活动状态。对于这种情况,多个 组件可以将其内容挂载到同一个目标元素。顺序将是一个简单的追加——稍后挂载将位于目标元素中较早的挂载之后。

<teleport to="#modals"><div>A</div>
</teleport>
<teleport to="#modals"><div>B</div>
</teleport><!-- result-->
<div id="modals"><div>A</div><div>B</div>
</div>

Vue3 新特性 内置组件 <Teleport>相关推荐

  1. Vue3中 内置组件 Teleport 详解

    1. 基本概念 1.1 简单理解 不管是 Vue2 还是 Vue3 中都有内置组件的存在,如 component 内置组件.transition 内置组件等等.内置组件就是官方给我们封装的全局组件,我 ...

  2. Vue3内置组件Teleport

    一.Teleport的介绍 Teleport是Vue 3.0 新增的一个内置组件,主要是为了解决一些特殊场景下模态对话框组件.组件的渲染. Teleport 是一种能够将我们的模板移动到 DOM 中 ...

  3. Vue3内置组件teleport详解

    teleport的作用 该组件可以将指定内容渲染到特定容器中,而不受 DOM 层级的限制 应用场景 当蒙层内容在一个组件中时,蒙层内容是无法遮挡住全部内容的,因此,需要使用teleport将蒙层内容渲 ...

  4. vue3 内置组件keep-alive用法的全面介绍

    vue3 内置组件keep-alive用法的全面介绍 基础用法 首先看一个反面例子 const app = Vue.createApp({template: `<button v-for=&qu ...

  5. Vue基础+Vue3新特性

    目录 模板语法 文本 原始HTML 属性Attribute 使用 JavaScript 表达式 条件渲染 v-if v-else v-show v-if vs v-show 的区别 列表渲染 事件处理 ...

  6. VUE内置组件 vue使用插槽分发内容 组件缓存 实现动画的过渡效果

    动态组件 除了允许用户自定义组件之外,Vue还内置了一些组件,以帮助用户高效地开发一些功能.本章将带领大家一起来了解这些内置组件. 某些时候需要动态切换页面部分区域的视图,这个时候内置组件compon ...

  7. 卷死了!再不学vue3就没有人要你了!速来围观vue3新特性

    一文全面了解vue3新特性 一.

  8. form-create教程:给内置组件和自定义组件添加事件

    本文将介绍form-create如何给内置组件和自定义组件添加事件 form-create 是一个可以通过 JSON 生成具有动态渲染.数据收集.验证和提交功能的表单生成器.并且支持生成任何 Vue ...

  9. vue中怎么清空tab选项卡的缓存_vuejs 内置组件component实现tab切换懒加载和表单输入框内容的清空...

    最近项目中使用了vue2.0 官网脚手架进行了开发.开发中的踩一些坑一直没有来得及整理.本篇文章就vuejs内置组件component的一些使用进行一些总结. 1.使用component 实现tab切 ...

最新文章

  1. Lite-HRNet
  2. 高通安卓调试LCD几方面总结
  3. <<温泉屋的小老板娘>>观后感
  4. 设计模式之简单工厂模式加反射
  5. webpack资源管理
  6. java定时任务设置为每天执行一次,首次还是好的,到第二天就不执行了的原因
  7. ironpython3发布时间_IronPython0.9.3发布了 —— 介绍一下Decorator
  8. BAT Java面试154道题分享!搞懂轻松进BAT
  9. paip.函数式编程方法概述以及总结
  10. TI DSP 28335 自学之路,到此止步
  11. 木瓜移动再求上市:毛利率走低、盈利能力弱,沈思“迷恋”相亲
  12. Leetcode 368. Largest Divisible Subset
  13. pdm生成java_PowerDesigner通过SQL语句生成PDM文件并将name和comment进行互相转换
  14. 使用 Python 创建自己的文档扫描仪
  15. Spring切面通知执行的顺序(Advice Order)
  16. 《Python 常用技能》爬虫入门必备—ip代理 的优势与使用方法
  17. createjs中的Graphics
  18. android防止快速点击
  19. 游戏机马戏团用计算机怎么弹,疯狂马戏团推币机爆机位置和涨分技巧!新手都是这样错误操作...
  20. 移动产业之困:运营商、设备制造商、用户间关系

热门文章

  1. gentoo安装全过程
  2. Gentoo快速安装和安装在zfs上安装实践
  3. 从 0 开始运营抖音号——做超级网红
  4. 错误信息403-服务器拒绝执行该请求,营造良好氛围 掀起活动高潮
  5. C#中e.Cancel,e.Handled的区别与应用
  6. GenOS linux 安装 JDK jdk-6u45-linux-x64.bin
  7. wap(dopra linux )命令,光猫清零命令
  8. 软件技术架构高大上描述
  9. 国外可以免费发布供求信息的网站(转)
  10. 导航条样式代码【代码库】