前置知识: Vue 3

Teleport与Suspense

00:00
1 min Intermediate 2026/6/14

传送门与异步组件

1. Teleport

1.1 基本用法

Teleport 允许组件模板的一部分”传送”到 DOM 中的其他位置:

<template>
  <button @click="showModal = true">打开弹窗</button>

  <Teleport to="body">
    <div v-if="showModal" class="modal">
      <p>这是一个模态框</p>
      <button @click="showModal = false">关闭</button>
    </div>
  </Teleport>
</template>

1.2 to 属性

<!-- 传送到 body -->
<Teleport to="body">

<!-- 传送到指定选择器 -->
<Teleport to="#modals">

<!-- 传送到指定元素 -->
<Teleport :to="targetElement">

1.3 disabled 属性

<!-- 条件性传送 -->
<Teleport to="body" :disabled="isMobile">
  <!-- 移动端不传送,桌面端传送 -->
</Teleport>

1.4 多个 Teleport 共享目标

Teleport 传送到同一目标时,按渲染顺序追加。

2. Suspense

2.1 基本用法

<template>
  <Suspense>
    <template #default>
      <AsyncComponent />
    </template>
    <template #fallback>
      <LoadingSpinner />
    </template>
  </Suspense>
</template>

2.2 异步组件

// defineAsyncComponent
const AsyncComp = defineAsyncComponent(() => import('./HeavyComponent.vue'));

// 带 options
const AsyncComp = defineAsyncComponent({
  loader: () => import('./HeavyComponent.vue'),
  loadingComponent: LoadingSpinner,
  errorComponent: ErrorDisplay,
  delay: 200,
  timeout: 3000,
});

2.3 异步 setup

<script setup>
// async setup 组件会触发 Suspense
const data = await fetch('/api/data').then((r) => r.json());
</script>

2.4 Suspense 事件

<Suspense @pending="onPending" @resolve="onResolve" @fallback="onFallback">
  <AsyncComponent />
</Suspense>

2.5 嵌套 Suspense

<Suspense>
  <Header />
  <Suspense>
    <AsyncContent />
  </Suspense>
</Suspense>

知识检测

学习进度

-- 已学文档
--% 知识覆盖率

学习推荐

专注模式