前言:Teleport是一个内置的组件,可以将一个组件内部的一部分"传送"到该组件的DOM结构外层的位置去
使用场景:
- 全屏模态框
- 在已经布局好的页面上,进入到特定页面,需要在布局组件上渲染特定的内容
- 预览模式下,将内容展示在页面不同的地方
以上就是我在项目中使用的场景,更详细可前往官网查看
会遇到什么问题呢?
js
[Vue warn]: Failed to locate Teleport target with selector "#teleport-header-left". 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.
js
[Vue warn]: Invalid Teleport target on mount: null (object)
大概就是需要空投的节点'#teleport-header-left',还没渲染,或不存在,Teleport就已经开始投送了。
解决的办法:
引入defineAsyncComponent,将含有Teleport的文件懒加载。
js
import { defineAsyncComponent } from "vue";
const TeleportCom = definAsyncComponent(() => import('....'));
同一个组件内由上到下渲染,只要to的目标渲染了,就可以挂到对应的节点上。
还可以结合v-bind进行动态渲染到某个节点上去
js
<Teleport :to="targetRef">
<div>把我挂载<div>
</Teleport>
//js
const props = defineProps({
targetRef: {
type: String,
default: 'body',
}
})
禁用Teleport,场景:客户端需要空投,移动端不需要。
js
<Teleport :disabled="isMobile">
...
</Teleport>
多个Teleport共享目标,挂载到同一个id上,那么会有先后顺序,也就是追加在后面渲染
js
<Teleport to="#modals">
<div>A</div>
</Teleport>
<Teleport to="#modals">
<div>B</div>
</Teleport>