You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React中使用TailwindCSS实现条件渲染组件的状态过渡动画

问题原因

你当前用&&短路逻辑做条件渲染,当successMessage变为false时,组件会直接从DOM树卸载,Tailwind过渡类需要作用在已挂载DOM的属性变化上,根本没有执行退出动画的时间,所以看不到效果。


方案1:不卸载组件,用样式控制显隐(最简单实现)

始终挂载组件,用状态控制透明度、高度等可过渡属性的变化,修改后代码如下:

<div 
  className={`flex transition-all ease-in-out duration-300 bg-gray-200 w-44 items-center justify-between px-2 rounded ${
    successMessage 
      ? 'opacity-100 h-auto py-2 scale-100' 
      : 'opacity-0 h-0 py-0 scale-95 overflow-hidden pointer-events-none m-0'
  }`}
>
  <p>Added to watchlist!</p>
  <button onClick={() => setSuccessMessage(false)}>X</button>
</div>

注意要给隐藏状态明确的属性初始值,同时把内边距、外边距也同步设置为0,避免隐藏后残留空白区域。


方案2:需要卸载组件时,配合过渡库实现

如果组件隐藏后需要从DOM中移除,使用framer-motion的AnimatePresence组件处理卸载前的动画逻辑:

  1. 先安装依赖:
    npm install framer-motion
  2. 修改代码:
import { AnimatePresence, motion } from "framer-motion"

// 组件渲染部分
<AnimatePresence>
  {successMessage && (
    <motion.div 
      initial={{ opacity: 0, y: -8, scale: 0.95 }}
      animate={{ opacity: 1, y: 0, scale: 1 }}
      exit={{ opacity: 0, y: -8, scale: 0.95 }}
      transition={{ duration: 0.3, ease: "easeInOut" }}
      className="flex bg-gray-200 w-44 items-center justify-between px-2 py-2 rounded"
    >
      <p>Added to watchlist!</p>
      <button onClick={() => setSuccessMessage(false)}>X</button>
    </motion.div>
  )}
</AnimatePresence>

该方案会在组件卸载前自动执行你定义的退出动画,动画结束后再移除DOM节点,适合弹窗、通知等需要频繁显隐的组件。


内容的提问来源于stack exchange,提问作者Eric Pezzulo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 07:54:02