# 前言
Vue 内置了 Trasition 组件可以帮助我们快速简单的实现基于状态变换的动画效果。该组件支持了 CSS 过渡动画、CSS 动画、Javascript 钩子 几种模式,接下来我们将逐步介绍这几种模式的实现原理。
# 基于 CSS 的过渡效果
我们先来看官网上一个简单的关于 CSS Transiton 过渡动画的示例: 以下是最基本用法的示例:
html
复制代码<template>
<button @click="show = !show">Toggle</button>
<Transition>
<p v-if="show">hello</p>
</Transition>
</template>
<style>
.v-enter-active,
.v-leave-active {
transition: opacity 0.5s ease;
}
.v-enter-from,
.v-leave-to {
opacity: 0;
}
</style>
@前端进阶之旅: 代码已经复制到剪贴板
然后再来看看官网上对于这些类名的实现定义:
v-enter-from:进入动画的起始状态。在元素插入之前添加,在元素插入完成后的下一帧移除。v-enter-active:进入动画的生效状态。应用于整个进入动画阶段。在元素被插入之前添加,在过渡或动画完成之后移除。这个class可以被用来定义进入动画的持续时间、延迟与速度曲线类型。v-enter-to:进入动画的结束状态。在元素插入完成后的下一帧被添加 (也就是v-enter-from被移除的同时),在过渡或动画完成之后移除。v-leave-from:离开动画的起始状态。在离开过渡效果被触发时立即添加,在一帧后被移除。v-leave-active:离开动画的生效状态。应用于整个离开动画阶段。在离开过渡效果被触发时立即添加,在过渡或动画完成之后移除。这个 class 可以被用来定义离开动画的持续时间、延迟与速度曲线类型。v-leave-to:离开动画的结束状态。在一个离开动画被触发后的下一帧被添加 (也就是v-leave-from被移除的同时),在过渡或动画完成之后移除。
可以看到,我们参考官网的描述,也可以简单的实现一个基于 css 的过渡动画,但这里存在了几个问题:
- 硬编码了
transiton动画,没有实现animate动画。 - 不够抽象,难以复用到后续组件。
接下来我们一起来看看 Vue 源码是如何实现的,首先找到关于 Transition 组件的定义:
export const Transition = (props, { slots }) => h(BaseTransition, resolveTransitionProps(props), slots)
Transition.displayName = 'Transition'
@前端进阶之旅: 代码已经复制到剪贴板
代码很简单,Transition 组件是一个函数式组件,本身就是一个渲染函数。还记得我们之前说过吗,Vue 组件分为了有状态组件和函数组件,有状态组件内部会存储组件的状态,而函数组件不会。
我们知道 Vue 对 Transtion 内置组件的功能定义就是只是一个容器,一个搬运工,需要渲染 DOM,那就不需要 template,本身不需要维护任何状态。所以这里直接通过一个函数式组件定义了 Transition 组件。
接着,我们看到了该组件核心功能就是一个渲染 BaseTransition 组件,并为期传入处理好的 props
