直接用 :is 绑定响应式变量可灵活切换动态组件,支持字符串名(如'user-profile')或组件对象(含异步加载),需提前局部或全局注册;配合 <keep-alive> 可缓存状态,避免重复销毁重建,并注意 SSR 同步引入与空值兜底。
`)灵活切换渲染不同的子组件">
直接用 `` 就能实现灵活切换,核心是让 `:is` 绑定一个响应式变量,值为组件名字符串或组件对象,Vue 自动匹配并渲染。
`:is` 接收两类值,选一种即可:
'UserForm'、'ProductList',注意命名推荐用 kebab-case(如 'user-profile'),避免大小写混淆defineAsyncComponent 做懒加载,例如:
import { defineAsyncComponent } from 'vue'const AsyncChart = defineAsyncComponent(() => import('./Chart.vue'))
然后绑定 :is="AsyncChart"
动态组件不会自动识别未声明的组件,所以得确保目标组件已在当前作用域注册:
components 选项里显式声明,如 components: { UserForm, ProductList }
main.js 中调用 app.component('UserForm', UserForm)
computed 返回默认占位组件默认每次切换都会销毁旧组件、新建新组件,表单输入、滚动位置等全丢。加一层 <keep-alive> 即可解决:
<keep-alive><component :is="currentComp"></component></keep-alive>
beforeUnmount/unmounted,而是触发 activated 和 deactivated 钩子,适合做数据拉取或资源清理include 或 exclude 属性,精准控制哪些组件参与缓存,例如 <keep-alive include="UserForm,ProductList">
常见场景下几个关键提醒:
:is 里写三元表达式,如 :is="type === 'form' ? FormComp : ListComp",应提前在 computed 或 ref 中算好再绑定:is 加载的组件必须同步引入,否则客户端 hydration 会出错null、undefined 或未注册名时,Vue 不报错也不提示,建议加校验或 fallback 组件提升健壮性