Vue3 内置组件

Vue 内置了一批组件,无需 import 或注册即可在模板中直接使用:component、Transition、TransitionGroup、KeepAlive、Teleport、Suspense。它们分别解决动态渲染、过渡动画、状态缓存、DOM 传送与异步等待等问题,是写出精致页面和优化性能的利器。

component:动态组件

component 的 is 属性指向哪个组件,就渲染哪个组件:

<script setup>
import Home from './Home.vue'
import About from './About.vue'

const current = Home   // 点击导航时改成 About 即可切换
</script>

<template>
  <component :is="current" />
</template>

is 变化时,Vue 自动卸载旧组件并挂载新组件。

Transition:单元素过渡

Transition 包裹单个元素或组件,在插入、移除时自动添加过渡类名:

<button @click="show = !show">切换显示</button>

<transition name="fade">
  <p v-if="show">我会淡入淡出</p>
</transition>

配套样式遵循 fade-enter-from、fade-leave-to 等命名规律:

.fade-enter-active,
.fade-leave-active { transition: opacity 0.3s ease; }
.fade-enter-from,
.fade-leave-to { opacity: 0; }

效果:段落出现时从透明渐变为不透明,消失时反向渐变。

TransitionGroup:列表过渡

给 v-for 列表整体加过渡,增删、移动元素都带动画:

<transition-group name="list" tag="ul">
  <li v-for="item in items" :key="item.id">{{ item.text }}</li>
</transition-group>

注意列表中每一项仍然必须提供唯一的 key,否则动画无法定位元素。

KeepAlive:缓存组件

配合动态组件或路由使用时,KeepAlive 会保留组件状态而不是销毁它:

<keep-alive>
  <component :is="current" />
</keep-alive>

切换走再切回来,组件内的滚动位置、表单输入等状态原样保留,无需重新请求数据。组件可通过 onActivated 与 onDeactivated 感知「被激活/被缓存」。

Teleport:传送内容

把某段内容渲染到组件之外的 DOM 位置,最典型的是弹窗:

<teleport to="body">
  <div class="modal-backdrop">全屏弹窗内容</div>
</teleport>

弹窗最终被挂到 body 下,不受父级 overflow、z-index 等样式限制,遮罩能盖住整个页面。

小结

内置组件覆盖了渲染控制、过渡动画、状态缓存与 DOM 传送等通用需求。先掌握 component 与 KeepAlive 的动态组合,再配合 Transition 做出动画,页面的灵活度与质感会明显提升。

笔记加载中…