Teleport 传送模板 - vue 内置组件
Teleport 传送模板
是一个内置组件,使我们可以将一个组件的一部分模板“传送”到该组件的 DOM 层次结构之外的 DOM 节点中。
基本使用
有时我们可能会遇到以下情况:组件模板的一部分在逻辑上属于它,但从整个应用视图的角度来看,在 DOM 中它应该显示在 Vue 应用之外的其他地方。
最常见的例子是想要一个全屏的模态框时。理想情况下,我们希望模态框的按钮和模态框本身是在同一个组件中,因为它们都与组件的开关状态有关。但这意味着该模态框将与按钮一起渲染在应用 DOM 结构里很深的地方。这会导致该模态框的 CSS 布局代码很难写。
试想下面这样的 HTML 结构:
Tooltips with Vue 3 Teleport
接下来我们来看看MyModal
的实现。
// MyModal.vue Open Modal.modal { position: fixed; z-index: 999; top: 20%; left: 50%; width: 300px; margin-left: -150px; }Hello from the modal!
Close
这个组件中有一个 当在初始 HTML 结构中使用这个组件时,会有一些潜在的问题: Hello from the modal! 你可以将 这也意味着来自父组件的注入也会按预期工作,子组件将在 Vue Devtools 中嵌套在父级组件下面,而不是放在实际内容移动到的地方。 在某些场景中,你们可能需要视情况禁用 这里的isMobile状态可以根据 CSS media query 不同结果动态地更新。 一个可重用的模态框组件可能同时存在多个实例。对于此类场景,多个 我们给出下面这样的用例: 渲染的结果为:按钮来触发打开模态框,和一个 css 类名为.modal的
position: fixed
能够相对于视口放置的条件是:没有任何祖先元素设置了transform
、perspective
或者filter
样式属性。而如果我们想要用 CSS transform
为祖先节点z-index
被包含它的元素所制约。如果有其他元素与z-index
,则它会覆盖住我们的模态框。提供了一个更简洁的方式来解决此类问题,使我们无需考虑那么多层 DOM 结构的问题。让我们用改写一下
:
Open Modal
接收一个
to
prop 来指定传送的目标。其值可以是一个 CSS 选择器字符串或者一个真实的DOM 节点。这里我们其实就是让 Vue 去“传送这部分模板片段到body
标签下”。和
结合使用来创建一个带动画的模态框。
挂载时,传送门的
to
目标必须是已经存在于 DOM 之中。理想情况下,这应该是整个 Vue 应用 DOM 树外部的一个元素。如果目标元素也是由 Vue 渲染的,你需要确保在挂载在之前挂载该元素。
搭配组件使用
只改变了渲染的 DOM 结构,它不会影响组件间的逻辑关系。这也就是说,如果
包含了一个组件,那么该组件始终和这个使用了
的组件保持逻辑上的父子关系。传入的props和触发的事件也会照常工作。
禁用传送门
。举个例子,我们想要在桌面端将一个组件当做浮层来渲染,但在移动端则当作行内组件。可以对
动态地传入一个disabled prop 来处理这两种不同情况。
...
同一目标上多个传送门
组件可以将其内容挂载在同一个目标元素上,而顺序就是简单的顺次追加,后挂载的将排在目标元素下更后面的位置上。
鹏仔微信 15129739599 鹏仔QQ344225443 鹏仔前端 pjxi.com 共享博客 sharedbk.com
图片声明:本站部分配图来自网络。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!