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

React/Next.js中如何实现每次调用都触发div动画效果

问题根因

你当前的写法是直接把组件函数存入content状态,React会复用已有的DOM节点结构,而你的<Section>标签的动画默认只在组件首次挂载时触发,后续切换内容时不会重新触发挂载流程,因此动画不会重复执行。

解决方案

你不需要额外使用useEffect,只要调整状态存储逻辑+给内容组件绑定唯一key属性即可实现需求:React检测到key变化时会自动卸载旧组件、挂载新组件,既会重新触发入场动画,也会自动清理旧组件占用的内存。

修改后的参考代码如下:

// 存储当前选中的进度条id,而不是直接存储组件
const [activeBarId, setActiveBarId] = useState(null);

// 时间线部分,点击时赋值对应id
<div>
    <Bar1 onClick={() => setActiveBarId('bar1')}/>
    <Bar2 onClick={() => setActiveBarId('bar2')}/>
</div>

// 内容展示部分,根据id渲染对应组件,绑定和id一致的key
<div>
  {activeBarId === 'bar1' && <BarContent_1 key="bar1" />}
  {activeBarId === 'bar2' && <BarContent_2 key="bar2" />}
</div>

// 进度条对应内容组件保持不变即可
const BarContent_1 = () => {
    return (
        <Section>
           Content of bar 1
        </Section>
    )
}
const BarContent_2 = () => {
    return (
        <Section>
           Content of bar 2
        </Section>
    )
}

补充说明

如果你的进度条数量比较多,也可以提前把id和组件的映射关系存在对象里,简化渲染部分的判断逻辑:

const barContentMap = {
  bar1: BarContent_1,
  bar2: BarContent_2
}

// 渲染部分可以简化为
<div>
  {activeBarId && (() => {
    const Content = barContentMap[activeBarId];
    return <Content key={activeBarId} />
  })()}
</div>

内容的提问来源于stack exchange,提问作者Rodrigo Yañez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 06:36:01