Vue Router需配合transition组件实现动画,基础用fade淡入淡出;可基于meta.transition动态切换动画类型;通过meta.index对比实现前进/后退方向识别;关键须加:key="route.fullPath"防组件复用导致动画失效。

Vue Router 本身不自带动画,但配合 Vue 的 transition 组件和路由元信息(meta),就能轻松实现页面切换时的过渡效果。关键在于控制组件挂载/卸载的时机、绑定正确的 CSS 类名,并让动画响应路由变化逻辑。
基础淡入淡出动画
最常用也最易上手的方式:用 <transition> 包裹 <router-view>,并定义对应 CSS 类。
- 模板中写法:
<router-view v-slot="{ Component }"><br> <transition name="fade"><br> <component :is="Component" /><br> </transition><br></router-view> - CSS 需包含六类状态(Vue 3):
.fade-enter-active, .fade-leave-active { transition: opacity 0.3s ease; }<br>.fade-enter-from { opacity: 0; }<br>.fade-enter-to { opacity: 1; }<br>.fade-leave-from { opacity: 1; }<br>.fade-leave-to { opacity: 0; } - 务必注意:
name属性值会作为类名前缀,必须与 CSS 中的命名严格一致
按路由动态切换动画类型
不同页面适合不同动效,比如首页用淡入,列表页进详情页用右滑,返回时用左滑——靠 meta.transition 实现差异化。
将一个或多个视频上传至YouTube。当用户想“上传到YouTube”“发YouTube”“批量上传”“upload to YouTube”“post videos to YouTube”或发布到YouTube时使用此技能。
- 在路由配置中添加动画标识:
{ path: '/user', component: User, meta: { transition: 'slide-right' } } - 模板中动态绑定:
<transition :name="route.meta.transition || 'fade'"><br> <component :is="Component" /><br></transition>
- 每个动画类型单独写一套 CSS,例如:
.slide-right-enter-active, .slide-right-leave-active { transition: transform 0.3s ease; }<br>.slide-right-enter-from { transform: translateX(100%); }<br>.slide-right-enter-to { transform: translateX(0); }<br>.slide-right-leave-from { transform: translateX(0); }<br>.slide-right-leave-to { transform: translateX(-100%); }
区分前进/后退方向的智能动画
用户点击“返回”时希望看到反向动画,这就需要判断路由跳转方向。常用做法是给路由加层级索引(meta.index),再对比目标与来源的深度。
立即学习“前端免费学习笔记(深入)”;
- 定义路由层级:
{ path: '/', component: Home, meta: { index: 0 } },<br>{ path: '/list', component: List, meta: { index: 1 } },<br>{ path: '/detail/:id', component: Detail, meta: { index: 2 } } - 在路由守卫或
router.afterEach中计算方向:router.afterEach((to, from) => {<br> to.meta.direction = to.meta.index > from.meta.index ? 'forward' : 'back';<br>}); - 模板中使用:
<transition :name="route.meta.direction === 'forward' ? 'slide-right' : 'slide-left'"><br> <component :is="Component" /><br></transition>
避免复用导致动画失效的关键细节
当两个路由渲染同一个组件(如都用 User.vue 但参数不同),Vue 默认复用实例,transition 不会触发。解决办法是强制刷新组件实例。
- 给
<component>添加唯一 key:<component :is="Component" :key="route.fullPath" /> -
$route.fullPath包含路径+查询参数+哈希,能确保每次跳转 key 都不同 - 若只依赖 params 变化,也可用
:key="route.params.id",但不如 fullPath 全面


















