Options API 怎么在过渡动画(Transition)中使用 JavaScript 钩子函数精细控制动画

云墨小哥_5443

云墨小哥_5443

2026-08-24

600人浏览

原创

transition组件通过4个核心js钩子(before-enter、enter、after-enter、before-leave)实现精细动画控制,需在methods中定义并传入,注意调用done()、避免箭头函数、协调css与js动画冲突。

options api 怎么在过渡动画(transition)中使用 javascript 钩子函数精细控制动画

Options API 中的 Transition 组件通过 JavaScript 钩子函数,可以在动画不同阶段执行自定义逻辑,实现比 CSS 更精细的控制(比如动态计算样式、监听第三方库动画、触发数据更新、或与 Canvas/WebGL 同步)。关键在于正确挂载钩子并配合 v-if 或 v-show 触发过渡流程。

必须掌握的 4 个 JS 钩子时机

Transition 组件支持以下六个钩子(其中 before-leave 和 leave-cancelled 常被忽略但很实用):

Java Maven Code Review
Java Maven Code Review

审查Java Maven项目(ZIP压缩包或GitLab仓库URL),检查代码规范、命名、模块边界、可维护性问题以及重复代码。

下载
  • before-enter:元素插入 DOM 前调用,此时元素尚未渲染,适合初始化状态(如设置初始 transform、opacity)
  • enter:元素已插入、CSS 动画/transition 尚未开始,适合手动触发动画(如 requestAnimationFrame 启动 JS 动画)
  • after-enter:CSS 动画/transition 完成后调用,适合清理、标记完成状态、或触发后续逻辑
  • enter-cancelled:enter 过程中被中断(如快速切换显隐)时调用,必须重置元素状态,否则下次 enter 可能异常
  • before-leave:元素即将离开前调用,适合保存当前尺寸、滚动位置或触发退出前的数据校验
  • leave-cancelled:leave 被中断时调用,需恢复元素可见性及内联样式(尤其当用了 display: none)

钩子函数如何绑定到组件实例

在 Options API 的 methods 中定义钩子函数,再通过 <transition></transition> 的属性传入。注意:钩子接收原生 DOM 元素作为唯一参数,不是 Vue 实例。

export default {
  methods: {
    beforeEnter(el) {
      el.style.opacity = 0
      el.style.transform = 'translateY(20px)'
    },
    enter(el, done) {
      // 使用 JS 动画(如 GSAP、anime.js)或 requestAnimationFrame
      const anim = anime({
        targets: el,
        opacity: [0, 1],
        translateY: [20, 0],
        duration: 300,
        easing: 'ease-out',
        complete: done // 必须调用 done() 告诉 Vue 动画结束
      })
    },
    afterEnter(el) {
      console.log('动画完成,可触发事件或更新 state')
      this.isAnimating = false
    },
    beforeLeave(el) {
      // 记录当前高度,用于 height 过渡
      el._originalHeight = el.offsetHeight
    },
    leave(el, done) {
      // 手动控制高度收缩(避免 CSS height: auto 无法过渡)
      const height = el.offsetHeight
      el.style.height = height + 'px'
      // 强制重排,确保 height 生效
      getComputedStyle(el).height
      el.style.height = '0'
      el.style.overflow = 'hidden'
      // 监听 transitionend 或用 setTimeout 模拟
      el.addEventListener('transitionend', () => {
        el.style.overflow = ''
        done()
      }, { once: true })
    }
  }
}

常见陷阱与避坑建议

  • 忘记调用 done():使用 enter 或 leave 时若启用 appear 或异步逻辑,未调用 done() 会导致 Vue 卡住过渡状态,元素无法进入/离开
  • 钩子内访问 this 失效:钩子是普通函数,this 指向 Vue 实例——但仅在方法定义在 methods 中且未被箭头函数包裹时才成立;避免在钩子内部直接写箭头函数
  • 多个过渡嵌套时钩子触发顺序混乱:外层 Transition 的 after-enter 可能早于内层的 enter,需用事件总线或 $nextTick 协调
  • CSS 与 JS 动画冲突:若同时声明了 enter-active-class 和 enter 钩子,CSS transition 会与 JS 动画竞争,建议禁用 CSS 动画:enter-active-class="!transition-none"(配合 Tailwind)或移除相关 class

配合 v-show / v-if 的行为差异

v-if 触发完整生命周期:before-enter → enter → after-enter(显示),before-leave → leave → after-leave(隐藏);v-show 只触发 enter 和 leave(因为 DOM 一直存在),且不会调用 before-enter/before-leave —— 若需初始化样式,应在 enter 中判断 el.style.opacity === '' 并补全。

大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!

相关专题

更多
python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2223

5

前端如何实现即时通讯
前端如何实现即时通讯

实现即时通讯的方法有WebSocket、Long Polling、Server-Sent Events、WebRTC等等。详细介绍:1、WebSocket,它可以在客户端和服务器之间建立持久连接,实现实时的双向通信,前端可以使用 WebSocket API来创建WebSocket连接,并通过发送和接收消息来实现即时通讯;2、Long Polling,是一种模拟实时通信的技术等等。

2023.10.09

4783

6

前端和后端的区别
前端和后端的区别

前端关注的是用户界面的设计和交互,而后端则注重数据处理和逻辑控制。想了解更多前端后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

5910

13

php和前端的关联介绍
php和前端的关联介绍

php既可以作为前端语言,也可以作为后端语言。想了解更多php和前端的相关内容,可以阅读本专题下面的文章。

2024.03.22

5358

10

前端外包工作内容有哪些
前端外包工作内容有哪些

前端外包工作内容包括:1. 网站和应用程序开发;2. 用户界面和交互设计;3. 用户体验优化;4. 设计和视觉开发;5. 跨浏览器兼容性;6. 性能优化;7. 维护和更新;8. 项目管理和沟通。想了解更多前端的相关内容,可以阅读本专题下面的文章。

2024.05.22

763

5

js获取数组长度的方法
js获取数组长度的方法

在js中,可以利用array对象的length属性来获取数组长度,该属性可设置或返回数组中元素的数目,只需要使用“array.length”语句即可返回表示数组对象的元素个数的数值,也就是长度值。php中文网还提供JavaScript数组的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.20

4426

5

js刷新当前页面
js刷新当前页面

js刷新当前页面的方法:1、reload方法,该方法强迫浏览器刷新当前页面,语法为“location.reload([bForceGet]) ”;2、replace方法,该方法通过指定URL替换当前缓存在历史里(客户端)的项目,因此当使用replace方法之后,不能通过“前进”和“后退”来访问已经被替换的URL,语法为“location.replace(URL) ”。php中文网为大家带来了js刷新当前页面的相关知识、以及相关文章等内容

2023.07.04

1109

3

js四舍五入
js四舍五入

js四舍五入的方法:1、tofixed方法,可把 Number 四舍五入为指定小数位数的数字;2、round() 方法,可把一个数字舍入为最接近的整数。php中文网为大家带来了js四舍五入的相关知识、以及相关文章等内容

2023.07.04

4344

6

js删除节点的方法
js删除节点的方法

js删除节点的方法有:1、removeChild()方法,用于从父节点中移除指定的子节点,它需要两个参数,第一个参数是要删除的子节点,第二个参数是父节点;2、parentNode.removeChild()方法,可以直接通过父节点调用来删除子节点;3、remove()方法,可以直接删除节点,而无需指定父节点;4、innerHTML属性,用于删除节点的内容。

2023.09.01

880

4

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Vue 教程
Vue 教程

共42课时 | 16.9万人学习

国外Web开发全栈课程全集
国外Web开发全栈课程全集

共12课时 | 1.4万人学习

Vue.js 微实战--十天技能课堂
Vue.js 微实战--十天技能课堂

共18课时 | 1.7万人学习