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

React中状态更新时重复触发CSS动画的解决方案咨询

React状态更新时重复触发CSS动画的解决方案

下面是几种无需创建多个元素或手动切换类的简洁方案:

方案1:利用React的key属性(最简洁)

React会在key值变化时销毁旧元素并创建新元素,CSS动画会随之重新触发。直接将动态变化的data作为元素的key即可:

const [data, setData] = useState(0);

return(
  <>
    <div className="fade-in" key={data}>
     <p>{data}</p>
    </div>
  </>
)

CSS保持原代码不变。每次data更新,key同步变化,div会被重新渲染,动画自然重复执行。

方案2:通过useEffect动态重置动画

如果不想重新创建元素,可以利用useEffect监听data变化,手动重置元素的动画状态:

import { useState, useEffect, useRef } from 'react';

const [data, setData] = useState(0);
const contentRef = useRef(null);

useEffect(() => {
  const element = contentRef.current;
  // 先移除动画类,触发重绘后再重新添加
  element.classList.remove('fade-in');
  void element.offsetWidth; // 强制浏览器识别类的移除操作
  element.classList.add('fade-in');
}, [data]);

return(
  <>
    <div ref={contentRef} className="fade-in">
     <p>{data}</p>
    </div>
  </>
)

void element.offsetWidth是关键,它会强制浏览器立即重绘,确保类的移除被识别,之后重新添加类时动画会再次触发。

方案3:使用CSS Transition替代Animation

如果可以调整动画实现方式,用transition配合状态控制透明度也是一种简洁的方式:

import { useState, useEffect } from 'react';

const [data, setData] = useState(0);
const [isVisible, setIsVisible] = useState(true);

useEffect(() => {
  // 每次data变化时,先隐藏再触发显示过渡
  setIsVisible(false);
  const timer = setTimeout(() => {
    setIsVisible(true);
  }, 10);
  return () => clearTimeout(timer);
}, [data]);

return(
  <>
    <div style={{ opacity: isVisible ? 1 : 0, transition: 'opacity 1100ms' }}>
     <p>{data}</p>
    </div>
  </>
)

这种方式不需要额外的CSS类,直接通过内联样式控制过渡效果,每次data变化时触发透明度的切换。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 02:57:41