[Vue3]Transition + Component实现路由跳转浅入浅出效果

实现

transition + component组合

<template>
    <!--    <router-view />-->

    <router-view v-slot="{ Component, route }">
        <transition name="fade" mode="out-in">
            <component :is="Component" :key="route.path" />
        </transition>
    </router-view>
</template>

<style>
.fade-enter-active,
.fade-leave-active {
    transition: opacity 0.5s ease;
}

.fade-enter-from,
.fade-leave-to {
    opacity: 0;
}
</style>

Transition简介

官网介绍:https://cn.vuejs.org/guide/built-ins/transition.html#css-based-transitions

Vue 提供了两个内置组件,可以帮助你制作基于状态变化的过渡和动画:

  • <Transition> 会在一个元素或组件进入和离开 DOM 时应用动画。本章节会介绍如何使用它。
  • <TransitionGroup> 会在一个 v-for 列表中的元素或组件被插入,移动,或移除时应用动画。

在进入/离开的过渡中,会有 6 个 class 切换。

  1. v-enter-from:定义进入过渡的开始状态。在元素被插入之前生效,在元素被插入之后的下一帧移除。
  2. v-enter-active:定义进入过渡生效时的状态。在整个进入过渡的阶段中应用,在元素被插入之前生效,在过渡/动画完成之后移除。这个类可以被用来定义进入过渡的过程时间,延迟和曲线函数。
  3. v-enter-to:定义进入过渡的结束状态。在元素被插入之后下一帧生效 (与此同时 v-enter-from 被移除),在过渡/动画完成之后移除。
  4. v-leave-from:定义离开过渡的开始状态。在离开过渡被触发时立刻生效,下一帧被移除。
  5. v-leave-active:定义离开过渡生效时的状态。在整个离开过渡的阶段中应用,在离开过渡被触发时立刻生效,在过渡/动画完成之后移除。这个类可以被用来定义离开过渡的过程时间,延迟和曲线函数。
  6. v-leave-to:离开过渡的结束状态。在离开过渡被触发之后下一帧生效 (与此同时 v-leave-from 被移除),在过渡/动画完成之后移除。

如下

<button @click='flag = !flag'>切换</button>
<transition name='fade'>
    <div v-if='flag' class="box"></div>
</transition>
//开始过渡
.fade-enter-from{
    background:red;
    width:0px;
    height:0px;
    transform:rotate(360deg)
}
//开始过渡了
.fade-enter-active{
    transition: all 2.5s linear;
}
//过渡完成
.fade-enter-to{
    background:yellow;
    width:200px;
    height:200px;
}
//离开的过渡
.fade-leave-from{
    width:200px;
    height:200px;
    transform:rotate(360deg)
}
//离开中过渡
.fade-leave-active{
    transition: all 1s linear;
}
//离开完成
.fade-leave-to{
    width:0px;
    height:0px;
}

Component简介

是一种内置特殊元素,性质类似于slot

介绍地址:https://cn.vuejs.org/api/built-in-special-elements.html

要渲染的实际组件由 is prop 决定。

  • is 是字符串,它既可以是 HTML 标签名也可以是组件的注册名。
  • 或者,is 也可以直接绑定到组件的定义。
<script>
import Foo from './Foo.vue'
import Bar from './Bar.vue'

export default {
  components: { Foo, Bar },
  data() {
    return {
      view: 'Foo'
    }
  }
}
</script>

<template>
  <component :is="view" />
</template>
Logo

前往低代码交流专区

更多推荐