vue.js组件过渡动画的javascript控制方案核心是利用transition组件的6个生命周期钩子协同css实现精细控制:@before-enter、@enter、@after-enter、@enter-cancelled、@before-leave、@leave、@after-leave,配合gsap等库或原生api执行动画,并注意v-show不支持钩子需改用v-if或手动封装。

Vue.js 组件过渡动画的 JavaScript 控制方案,核心在于利用 Transition 组件提供的生命周期钩子,在动画不同阶段执行自定义逻辑,从而实现比纯 CSS 更精细、更动态的控制能力。它不替代 CSS 过渡,而是与之协同,补足其灵活性不足的部分。
JavaScript 钩子函数的完整阶段
Vue 为 <transition></transition> 提供了 6 个可监听的 JavaScript 钩子,按执行顺序依次为:
- @before-enter:元素插入前调用,此时 DOM 已挂载但尚未进入动画,适合初始化样式(如设置初始 transform、opacity)
- @enter:进入动画开始时触发,DOM 已就位,可启动 JS 动画(如 GSAP、anime.js 或原生 requestAnimationFrame)
- @after-enter:进入动画结束后触发,常用于清理、状态重置或触发后续逻辑
- @enter-cancelled:进入过程中被中断(如快速切换 show 状态)时调用,需清理未完成的动画
- @before-leave:离开动画开始前调用,适合记录当前状态或添加临时 class
- @leave:离开动画启动时触发,是执行 JS 动画的主要入口点
- @after-leave:离开动画完全结束后触发,可用于释放资源或更新数据状态
结合第三方动画库的典型用法
钩子函数本身不执行动画,需配合动画库或原生 API 实现视觉变化。最常见的是集成 GSAP:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 在
@enter中调用gsap.from(el, { opacity: 0, y: 20 }) - 在
@leave中调用gsap.to(el, { opacity: 0, y: -20, duration: 0.3 }) - 务必在
@enter-cancelled和@after-leave中调用gsap.killTweensOf(el)防止动画残留 - 注意:
el是钩子函数自动传入的第一个参数,即当前过渡中的 DOM 元素
v-show 不支持 JS 钩子的限制与绕过方式
v-show 仅切换 display 属性,不会触发过渡的完整生命周期,因此所有 JS 钩子均无效。若需 JS 控制动画但又依赖显示/隐藏逻辑,应:
- 改用
v-if,确保元素真正挂载/卸载 - 或手动封装一个基于
ref+watch的逻辑:监听布尔值变化,通过nextTick确保 DOM 更新后,再调用 JS 动画 - 避免混合使用
v-show和<transition></transition>—— 此时只有 CSS 类名会切换,JS 钩子完全不触发
自定义动画逻辑的实用技巧
不依赖第三方库时,也可用原生方法实现可控动画:
- 在
@enter中用el.style.transition = 'none'瞬间设初态,再用nextTick恢复 transition 并修改终态属性 - 用
el.addEventListener('transitionend', handler, { once: true })替代@after-enter,适用于需要精确监听某条 CSS 属性结束的场景 - 多个动画并行时,在
@enter中返回一个 Promise,Vue 会等待其 resolve 后才调用@after-enter(需 Vue 3 或 2.7+ 支持) - 钩子函数中可通过
this访问当前组件实例,方便调用 methods 或更新 data
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










