首页前端开发VUEVue3+Tsx给路由加切换动画时的踩坑及解决

Vue3+Tsx给路由加切换动画时的踩坑及解决

时间2024-02-11 05:49:03发布访客分类VUE浏览1107
导读:收集整理的这篇文章主要介绍了Vue3+Tsx给路由加切换动画时的踩坑及解决,觉得挺不错的,现在分享给大家,也给大家做个参考。 目录项目场景样式文件步骤最终代码总结项目场景用最新的技术栈V...
收集整理的这篇文章主要介绍了Vue3+Tsx给路由加切换动画时的踩坑及解决,觉得挺不错的,现在分享给大家,也给大家做个参考。
目录
  • 项目场景
  • 样式文件
  • 步骤
  • 最终代码
  • 总结

项目场景

用最新的技术栈Vue+Tsx给后台管理系统路由加动画时,语法上与模板语法有些许不同,记录下自己的踩坑记录

样式文件

新建文件transITion.scss,这里用的是若依框架人家写好的样式,写好之后在全局引入该样式文件

// global transition css/* fade */.fade-enter-active,.fade-leave-active {
      transition: opacity 0.28s;
}
.fade-enter,.fade-leave-active {
      opacity: 0;
}
/* fade-transform */.fade-transform-leave-active,.fade-transform-enter-active {
      transition: all 0.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 0.5s;
}
.breadcrumb-enter,.breadcrumb-leave-active {
      opacity: 0;
      transform: translateX(20px);
}
.breadcrumb-move {
      transition: all 0.5s;
}
.breadcrumb-leave-active {
      position: absolute;
}
    

步骤

首先是第一步尝试给路由加过渡动画,代码如下

div style={
{
 flex: "1", paddingTop: "12px", height: 0 }
}
    >
    Transition name="fade-transform" mode="out-in">
    RouterView  v-slots={
{
        default: ({
 component: RouteComponent }
: {
 Component: any }
    ) =>
 {
                return RouteComponent />
        }
    }
}
        >
    /RouterView>
    /Transition>
    /div>
    

这时候路由完全没动画并且报了一个警告

Component inside Transition> renders non-element root node that cannot be aniMATEd.  

意思是在Transition动画节点下只能有一个根节点,这时候再尝试把RouteComponent外面套一层div

div style={
{
 flex: "1", paddingTop: "12px", height: 0 }
}
    >
    Transition name="fade-transform" mode="out-in">
    RouterView  v-slots={
{
        default: ({
 Component: RouteComponent }
: {
 Component: any }
    ) =>
 {
                return div>
    RouteComponent />
    /div>
        }
    }
}
        >
    /RouterView>
    /Transition>
    /div>
    

这时候还是没有切换动画的,新警告来了

router-view>
     can no longer be used directly inside transition>
     or keep-alive>
.Use slot PRops instead:router-view v-slot="{
 Component }
    ">
      transition>
        component :is="Component" />
      /transition>
    /router-view>
    

意思是说router-view不能放在transition下,好的那我们换一种写法试试

div style={
{
 flex: "1", paddingTop: "12px", height: 0 }
}
    >
  RouterView v-slots={
{
      default: ({
 Component: RouteComponent }
: {
 Component: any }
    ) =>
 {
              return Transition name="fade-transform" mode="out-in">
                  div>
     RouteComponent />
    /div>
              /Transition>
      }
  }
}
      >
    /RouterView>
    /div>
    

这时候就很完美,没警告了。但是??王德发??切换动效在哪里??我陷入了沉思,官方文档里给的示例是切换显示隐藏的时候用v-if,也就是隐藏的时候dom节点被销毁了,是不是我这个没重新渲染呢??这时候给div加上一个动态的key让它重新渲染就好了

import {
useRoute }
     From 'vue-router';
    const route = useRoute()
div style={
{
 flex: "1", paddingTop: "12px", height: 0 }
}
    >
  RouterView v-slots={
{
      default: ({
 Component: RouteComponent }
: {
 Component: any }
    ) =>
 {
              return Transition name="fade-transform" mode="out-in">
              div key={
route.path}
    >
     RouteComponent />
    /div>
              /Transition>
      }
  }
}
      >
    /RouterView>
    /div>
    

这时候就好了,虽然是可以了,但是这个any类型让我很是不舒服,本着一定要写代码优雅的原则,最后改动一下

最终代码

div style={
{
 flex: "1", paddingTop: "12px", height: 0 }
}
    >
RouterView v-slots={
{
    default:  ({
 Component }
: {
 Component: VNode }
    ) =>
 {
            return Transition name="fade-transform" mode="out-in">
            div key={
route.path}
 style={
{
 height: "100%" }
}
    >
                {
createVNode(Component)}
                /div>
            /Transition>
    }
}
}
    />
    /div>
    

这样看着就舒服了

总结

最后想说,TSX真香!走新技术的路上难免会遇到很多坑,但解决了真的很舒服

以上为个人经验,希望能给大家一个参考,也希望大家多多支持。

您可能感兴趣的文章:
  • 关于Vue3过渡动画的踩坑记录
  • 浅谈vue-router路由切换 组件重用挖下的坑
  • vue3+ts+vite2项目实战踩坑记录

声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!


若转载请注明出处: Vue3+Tsx给路由加切换动画时的踩坑及解决
本文地址: https://pptw.com/jishu/609400.html
VUE axios每次请求添加时间戳问题 Vue props传入function时的this指向问题解读

游客 回复需填写必要信息