Vue.js 渲染器对 Teleport 的特殊处理是在 patch 阶段跳过默认挂载逻辑,改为定向插入目标容器;它不改变响应式行为、作用域或事件机制,仅干预 DOM 物理归属位置。

Vue.js 渲染器对 Teleport 的特殊处理,本质是**在 patch 阶段跳过默认挂载逻辑,改为定向插入目标容器**。它不改变组件的响应式行为、作用域或事件机制,只干预真实 DOM 的物理归属位置。
Teleport VNode 被识别为独立类型
编译阶段,<teleport> 标签会被转为一个 type 为 Teleport 的特殊 VNode,结构类似:
{ type: Teleport, props: { to: 'body', disabled: false }, children, target: null }- 这个节点不会进入常规的
patchElement或patchComponent流程 - 渲染器在递归 patch 时遇到该类型,立刻交由
Teleport.process函数接管
挂载与更新都绕过父容器
无论首次挂载还是后续更新,Teleport 都不依赖当前 container(即父组件的 DOM 容器):
递归分析 Vue 项目组件依赖,从入口文件生成组件层级图,支持 Vue 2/3,输出组件名、文件路径和属性。适用于分析组件结构、排查依赖或了解项目架构。
- 首次挂载:根据
n2.props.to查找目标(如document.querySelector('body')),再将子节点的真实 DOM 插入其中 - 更新时:先正常比对子节点(
patchChildren),再判断to是否变化;若变化,调用move()把已有 DOM 迁移到新目标 -
move()会区分普通元素(取vnode.el)和组件实例(取vnode.component.subTree.el),确保拿到正确的真实节点
目标容器需提前就位,移动操作延迟执行
Teleport 不创建容器,只使用已存在的 DOM 节点:
立即学习“前端免费学习笔记(深入)”;
- 若
to指向的选择器无匹配节点,且未设disabled,内容直接不渲染(控制台警告) - 动态创建的目标(如 JS 新增的
<div id="modal-root"></div>)必须在 Teleport 第一次 patch 前插入文档,否则挂载失败 - DOM 移动操作通过
queuePostFlushCb推迟到 nextTick 后执行,避免因目标尚未 ready 导致错误
逻辑上下文完全保持原样
尽管 DOM 物理位置跨出组件树,但以下关键能力不受影响:
- 子组件仍运行在原始父组件的
setup()上下文、provide/inject链、响应式作用域中 - 事件监听绑定在真实 DOM 元素上,冒泡路径不变,
@click等仍可正常触发 -
<style scoped>编译结果仍基于源组件文件,与挂载位置无关 - SSR 中默认跳过 Teleport 内容,需手动注入
__teleport字段配合服务端逻辑

















