Teleport 的 disabled 属性用于动态控制传送开关:为 true 时内容原地渲染,忽略 to;为 false 时按 to 指定位置挂载,不影响响应式逻辑与生命周期。
Vue 的 Teleport 组件通过 disabled 属性可以灵活地在“传送”和“原地渲染”之间切换,不需要手动销毁或重建组件,也不影响响应式逻辑。关键在于:当 disabled 为 true 时,内容就在当前组件位置正常渲染;为 false 时,才按 to 指定的目标挂载。
disabled 是布尔值 prop,它不改变组件行为本身,只决定是否启用传送机制:
true → 内容保留在模板中原本的位置(即父组件内部 DOM 中),to 属性被忽略false(默认)→ 正常执行传送,内容移入 to 指定的 DOM 节点实际开发中,disabled 常用于适配不同环境或状态,比如移动端弹窗回退、条件性挂载、SSR 兼容等:
body<Teleport :disabled="isMobile" to="body"><Modal /></Teleport>
<Teleport :disabled="!showModal" to="#modal-root"><Modal v-if="showModal" @close="showModal = false" /></Teleport>
document.body 不可用,可设 :disabled="typeof document === 'undefined'" 安全兜底使用 disabled 时需注意几个细节,否则容易出现渲染异常:
to 值必须始终有效(即使 disabled 为 true),否则 Vue 会抛出警告;建议用静态选择器如 "#modal",避免动态拼接导致解析失败Teleport 共享同一目标时,disabled 独立生效——禁用某个实例不会影响其他实例向该目标追加内容v-if 使用要小心:如果同时用 v-if 控制 Teleport 外层,disabled 就失去意义;应优先用 disabled 控制挂载位置,用 v-show 或状态控制显隐当传送内容需要过渡动画时,disabled 可配合 <Transition> 实现更自然的切换:
<Transition> 包裹在 <Teleport> 外部,确保 enter/leave 钩子在正确时机触发<Transition> 放在 <Teleport> 内部,否则动画可能因挂载位置变化而中断