先上代码:
<template>
<div class="main">
<router-view v-slot="{ Component, route }">
<transition name="slide-fade" mode="out-in">
<keep-alive>
<component :is="Component" :key="route.path"></component>
</keep-alive>
</transition>
</router-view>
</div>
</template>
1.问题
项目使用vue3.5+vue-router4.5,在做路由跳转过渡效果时,出现奇葩问题:从首页跳转到其他页面后,div.main
的子元素完全丢失,导致页面空白!若是其他页面之间的来回跳转,完全没问题,过渡效果也有。
2.方案
开始找原因,网上说:
- 给
component
组件添加唯一key:key="route.path"
=> 没解决 - 给动画元素的进出动画时添加相对定位和绝对定位 => 没解决
- 把
transition
上的mode=out-in
移除 => 可以解决,但是需要结合上一条,在过渡时添加定位,否则页面会有闪动
那我emo了,为啥其他页面跳转没问题,唯独从首页跳转其他页面就空白了呢?
3.原因
经过排查,发现首页的代码如下:
<template>
<!-- <div class="txt">dashboard</div> -->
<div class="txt">
dashboard
....
</div>
</template>
把第一行的注释代码<div class="txt">dashboard</div>
移除解决问题
4.解释
- 在 Vue 的模板中,注释节点作为第一个元素有时会导致一些意外的行为,特别是在过渡动画和组件挂载/卸载时
- Vue 的过渡系统会处理模板中的所有节点,包括注释节点
- 当使用
mode="out-in"
时,过渡系统会尝试对第一个节点(注释)执行过渡 - 注释节点无法正常参与 DOM 过渡,导致整个过渡过程出现问题
- 这解释了为什么只有从首页跳转时会出现问题(因为其他页面没有以注释开头)
- 避免在模板顶层使用注释