当前位置: 首页 > news >正文

VUE3 使用 <transition> 实现组件切换的过渡效果

由于我想在项目中实现路由组件切换时的平滑过渡效果,以避免页面加载时的突兀感,大致效果如下:
在这里插入图片描述
上面的代码是使用的若依的代码,代码具体如下所示:

<section class="app-main"><transition name="fade-transform" mode="out-in"><keep-alive :include="cachedViews"><router-view :key="key" /></keep-alive></transition>
</section><style>
/* fade-transform */
.fade-transform-leave-active,
.fade-transform-enter-active {transition: all .5s;
}.fade-transform-enter {opacity: 0;transform: translateX(-30px);
}.fade-transform-leave-to {opacity: 0;transform: translateX(30px);
}/* breadcrumb transition */
.breadcrumb-enter-active,
.breadcrumb-leave-active {transition: all .5s;
}
</style>

我的项目使用的是 VUE3 + TS,于是我仿照上面的写法写了下面的代码:

<template><section:class="[sectionClass,'flex-1 p-[var(--app-content-padding)] w-[calc(100%-var(--app-content-padding)-var(--app-content-padding))] bg-[var(--app-content-bg-color)] dark:bg-[var(--el-bg-color)]']"><!-- 渲染路由视图 --><router-view v-slot="{ Component }"><transition name="fade-transform" mode="out-in"><keep-alive :include="getCaches"><component :is="Component" :key="route.fullPath" /></keep-alive></transition></router-view></section><Footer v-if="footer" :class="footerClass" />
</template>
<style>
/* slide-left */
.fade-transform-enter-active,
.fade-transform-leave-active {transition: all 0.5s;
}.fade-transform-enter {opacity: 0;transform: translateX(-10%); /* 进入时从屏幕左侧外部滑入 */
}.fade-transform-leave-to {opacity: 0;transform: translateX(10%); /* 离开时滑出到屏幕右侧外部 */
}
</style>

然而,在页面渲染时,我遇到了以下问题:
在这里插入图片描述
当选择“菜单管理”时,控制台打印出以下警告信息:

[Vue warn]: Component inside <Transition> renders non-element root node that cannot be animated.

此时,当我尝试切换到其他路由页面时,页面会显示为空白。出现此问题的原因在于,Vue 3 中的 组件要求其子节点必须是一个元素节点。

然而,由于我在 <router-view> 组件中使用了 v-slot 来获取路由组件的引用,并在 <component> 中渲染该引用,而我的 component 代码中存在多个节点,导致 Vue 报出错误。

为了避免此问题,我将所有子组件都包裹在一个单一的根元素内,例如将原先的 Menu 组件改写为如下代码结构:

<template><div class="app-container"><!-- 菜单管理的组件内容 --></div>
</template>

虽然解决了组件渲染的问题,但我又发现,页面切换时只有前一个组件消失时有过渡效果,而后一个组件显示时却是直接展现,没有过渡效果。如下所示:
在这里插入图片描述
进入效果无效的解决办法是我们需要手动指定enter-from-class,如果不指定enter-form-class,则只有离开时候的动画有效。
这个在vue2中没有出现,vue3中是这样的,而且只要进入的这一步需要自己指定。

最后代码如下:

<template><section:class="[sectionClass,'flex-1 p-[var(--app-content-padding)] w-[calc(100%-var(--app-content-padding)-var(--app-content-padding))] bg-[var(--app-content-bg-color)] dark:bg-[var(--el-bg-color)]']"><router-view v-slot="{ Component }"><transition name="fade-transform" mode="out-in" enter-from-class="fade-transform-enter"><keep-alive :include="getCaches"><component :is="Component" :key="route.fullPath" /></keep-alive></transition></router-view></section><Footer v-if="footer" :class="footerClass" />
</template>
<style>
/* slide-left */
.fade-transform-enter-active,
.fade-transform-leave-active {transition: all 0.5s;
}.fade-transform-enter {opacity: 0;transform: translateX(-100px); /* 进入时从屏幕左侧外部滑入 */
}.fade-transform-leave-to {opacity: 0;transform: translateX(10%); /* 离开时滑出到屏幕右侧外部 */
}
</style>

效果如下:
在这里插入图片描述


参考文章:
https://juejin.cn/post/6925715028964278280
https://cn.vuejs.org/guide/built-ins/transition.html#the-transition-component

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【日常记录-Linux】WebDriver
  • 如何打造抗冲击的超级电容器?用啥材料好?
  • 大数据技术概述
  • U盘常规数据恢复深度解析:原因、方案与预防策略
  • 文件包含PHP伪协议利用方法
  • c++(list)
  • CSS学习4[重点]
  • 原油市场“闪崩”,国际油价单日下跌超4%!
  • 一. 从Hive开始
  • 坑——fastjson将字符串转到带枚举的java对象
  • 【多线程】阻塞,忙等待,睡眠,挂起的简单理解,以及各自优缺点
  • Spring框架——springweb(一篇包会)
  • C#——XML序列化
  • 网络安全服务基础Windows--第9节-DNS部署与安全
  • 使用卫星仿真软件STK的一些应用和思考(星地链路、星间链路)
  • (十五)java多线程之并发集合ArrayBlockingQueue
  • 【跃迁之路】【519天】程序员高效学习方法论探索系列(实验阶段276-2018.07.09)...
  • css属性的继承、初识值、计算值、当前值、应用值
  • Django 博客开发教程 16 - 统计文章阅读量
  • HashMap ConcurrentHashMap
  • October CMS - 快速入门 9 Images And Galleries
  • SpiderData 2019年2月16日 DApp数据排行榜
  • VUE es6技巧写法(持续更新中~~~)
  • 看完九篇字体系列的文章,你还觉得我是在说字体?
  • 前端知识点整理(待续)
  • 一起来学SpringBoot | 第十篇:使用Spring Cache集成Redis
  • 移动互联网+智能运营体系搭建=你家有金矿啊!
  • 源码安装memcached和php memcache扩展
  • 最近的计划
  • ​LeetCode解法汇总2808. 使循环数组所有元素相等的最少秒数
  • ​埃文科技受邀出席2024 “数据要素×”生态大会​
  • #pragma multi_compile #pragma shader_feature
  • (arch)linux 转换文件编码格式
  • (delphi11最新学习资料) Object Pascal 学习笔记---第14章泛型第2节(泛型类的类构造函数)
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (附源码)ssm基于jsp的在线点餐系统 毕业设计 111016
  • (附源码)计算机毕业设计ssm基于Internet快递柜管理系统
  • (规划)24届春招和25届暑假实习路线准备规划
  • (论文阅读30/100)Convolutional Pose Machines
  • (每日持续更新)jdk api之FileFilter基础、应用、实战
  • (面试必看!)锁策略
  • (学习日记)2024.03.12:UCOSIII第十四节:时基列表
  • (一)C语言之入门:使用Visual Studio Community 2022运行hello world
  • (一)WLAN定义和基本架构转
  • .net 8 发布了,试下微软最近强推的MAUI
  • .NET CLR Hosting 简介
  • .NET Core 中的路径问题
  • .Net Winform开发笔记(一)
  • .net 后台导出excel ,word
  • .NET 使用 XPath 来读写 XML 文件
  • .NET 项目中发送电子邮件异步处理和错误机制的解决方案
  • .NET 直连SAP HANA数据库
  • .NET/C# 解压 Zip 文件时出现异常:System.IO.InvalidDataException: 找不到中央目录结尾记录。
  • .NET开源全面方便的第三方登录组件集合 - MrHuo.OAuth
  • /bin/rm: 参数列表过长"的解决办法