在嵌套路由中为不同子页面配置独立Transition动画,需将transition绑定到具体路由组件,通过meta信息定义动画名、enter/leave类,并在嵌套层级中分层包裹router-view,配合mode="out-in"和CSS重置避免闪动。

在嵌套路由中实现不同子页面使用不同 Transition 动画,核心在于将 绑定到具体路由组件上,而非全局包裹 。Vue Router 的 支持命名插槽和动态 name,配合组件级 name 或元信息(meta),就能为每个子路由单独控制动画。
1. 按路由 meta 配置动画名称
在路由定义中为每个子路由添加 meta.transitionName,例如:
{
path: '/home',
component: Home,
meta: { transitionName: 'slide-left' }
},
{
path: '/about',
component: About,
meta: { transitionName: 'fade-scale' }
},
{
path: '/profile',
component: Profile,
meta: { transitionName: 'slide-right' }
}
然后在布局组件中这样使用 :
<transition :name="route.meta.transitionName || 'fade'" mode="out-in"><router-view></router-view></transition>
其中 route 是通过 useRoute() 获取的当前路由对象。
2. 用动态 class 实现更灵活的动画组合
如果需要同时控制进入/离开动画(比如“左进右出”),可以拆解为 enter-active-class 和 leave-active-class:
- 在路由 meta 中定义
enterClass和leaveClass - 在模板中绑定:
- 配合 CSS 动画类(如
animate__slideInLeft)直接复用 animate.css 等库
3. 嵌套路由下多层动画隔离
当有嵌套路由(如 /user/list 和 /user/detail)时,父级 控制整体布局切换,子级 单独套一层 :
- 父组件(
User.vue)只对做布局过渡(如淡入) - 子组件(
UserList.vue、UserDetail.vue)内部再包裹自己的,用于列表项或详情页的局部动效 - 关键:子级
必须显式命名(如name="sub"),并在子路由中对应配置children+name
4. 避免动画叠加与闪动的要点
常见问题如“两次动画”“方向错乱”,可通过以下方式解决:
- 统一设置
mode="out-in",确保旧元素完全离开后再进入新元素 - 给每个动画 class 设置明确的
transform和opacity起始/结束值,避免浏览器默认行为干扰 - 在
beforeRouteUpdate或watch($route)中重置动画状态(如移除已触发的 class) - 对快速连续跳转(如连点菜单),可加节流逻辑,或用
v-if强制销毁重建组件来重置动画









