React Academy · 课时

无需库实现进入和退出动画

在 React 中手动控制 display 和 opacity 的时机,实现挂载和卸载动画。

第 4 / 4 课13 个步骤

无需库实现进入和退出动画 是 CoddyKit 上的免费 React Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 React Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 React Academy 课程共包含 4 节课。

卸载问题

当您使用 {show && } 进行条件渲染时,show 一旦变为 false,React 就会立即从 DOM 中移除元素。由于节点已经消失,没有时间播放退出动画。

进入动画很容易处理;真正的难点是退出动画。

方案 1:保持挂载

最简单的修复方法是永不卸载元素。让元素始终保持渲染状态,并在隐藏时将 opacity 动画设为零,同时设置 pointer-events: none;显示时再将其恢复为 1。

这样可以在两个方向上实现平滑淡化,但代价是元素会一直留在 DOM 中。

方案 2:挂载状态机

如果需要真正卸载,您可以使用包含 mounting、mounted、unmounting 和 unmounted 等阶段的小型状态机进行建模。只有在退出动画完成后,您才会移除节点。

状态会决定每个阶段应用哪些动画类名。

useMount 钩子

您可以将这套状态机封装在一个自定义钩子中,通常称为 useMount。它接收期望的可见性,并返回元素是否应存在于 DOM 中以及当前阶段。

由于时序逻辑位于可复用的钩子中,组件可以保持简洁。

进入类与退出类的配对

按照常见约定,挂载时依次应用 enter 和 enter-active,移除时依次应用 exit 和 exit-active。基础类设置起始状态,活动类则通过过渡设置结束状态。

在正确的帧之间切换这两个类,就能产生动画。

监听过渡结束事件

若要知道退出动画何时结束,请监听元素上的 transitionend 事件。当退出动画触发该事件时,将状态切换为 unmounted 并移除节点。

这样可以将卸载准确地绑定到视觉动画的结束时刻,而不是依赖猜测的超时时间。

可复用的过渡组件

您可以将所有这些逻辑封装在一个 Transition 组件中,让它接收一个 in 属性和子元素。它会在子元素播放退出动画期间保持其挂载状态,并根据每个阶段应用正确的类名。

使用方只需切换 in,就能自动获得正确的进入和退出动效。

正确触发活动类

有一个细节需要注意:您必须先让浏览器绘制起始类,然后再添加活动类,否则元素会直接跳变而不会产生过渡。在两者之间使用 requestAnimationFrame 或强制回流,可以确保过渡真正运行。

这样可以确保浏览器先记录起始值。

与 react-transition-group 对比

react-transition-group 库提供了 Transition 和 CSSTransition 组件,实现了这一完整模式,包括类名生命周期和卸载时序。

您的 DIY 版本体现了它的核心思想,因此在亲自构建过一个之后,就会很容易理解这个库。

何时使用库,何时使用 DIY

对于单个简单的淡入淡出效果,保持挂载的方案或一个小型钩子就足够了,还可以避免引入依赖。对于多个协调过渡、包含添加和移除操作的列表,或复杂的时序编排,使用库可以节省时间并减少边界情况错误。

请根据应用实际需要的动画复杂度来选择方案。

综合运用

退出动画要求元素一直存在,直到动画完成;您可以选择永不卸载、使用状态机配合 transitionend,或使用库来实现。

理解其中的机制后,您就能选择满足需求的最轻量方案。

快速检查

请检验您对退出动画的理解。

回顾

您了解了退出动画难以实现的原因、两种解决方案(保持挂载和挂载状态机)、transitionend 如何控制卸载时机,以及如何构建可复用的 Transition 组件。

您还了解了何时应使用 react-transition-group,而不是 DIY 实现。

免费开始

用 AI 导师学习 React — 免费

在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。

课程
88
课程
324

常见问题解答

「无需库实现进入和退出动画」课时是免费的吗?

是的 — 「无需库实现进入和退出动画」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 React Academy 课程的其余内容,请升级到 CoddyKit PRO。 React Academy 课程共包含 4 节课。

「无需库实现进入和退出动画」这节课中我会学到什么?

在 React 中手动控制 display 和 opacity 的时机,实现挂载和卸载动画。 你通过在浏览器中直接运行的动手代码来练习 React Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 React Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 React Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。

「无需库实现进入和退出动画」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 React Academy 课中编写并运行代码吗?

能。每节 React Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. React 状态变化中的 CSS 过渡
  2. 使用 React 实现 CSS 关键帧动画
  3. 用于动画前测量的 useLayoutEffect
  4. 无需库实现进入和退出动画
← 返回 React Academy