Vue3 transition过渡模式下元素丢失问题

先上代码:

<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 过渡,导致整个过渡过程出现问题
  • 这解释了为什么只有从首页跳转时会出现问题(因为其他页面没有以注释开头)
  • 避免在模板顶层使用注释
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容