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

React路由切换时如何重新渲染组件并触发useEffect执行

问题根因
  • React Router v6 匹配到同位置渲染的相同组件时,默认会复用组件实例,不会触发组件的卸载重挂载流程。
  • 你在ChartPage中定义的useEffect传入了空依赖数组[],该配置下副作用逻辑只会在组件首次挂载时执行1次,后续props更新不会触发重跑。
解决方案

方案1:给useEffect添加正确的依赖项(推荐)

这是最符合React设计规范的写法,直接把type加入useEffect的依赖数组,当type props随路由变化时,副作用就会自动重新执行。同时建议切换币种时先重置加载状态,避免页面短暂显示旧币种数据。

修改ChartPage.js中的useEffect部分:

useEffect(() => {
  // 切换币种时先重置为加载状态,避免显示旧数据
  setValues(null);
  getCoin(type)
    .then((response) => {
      setValues(response);
    })
    .catch((error) => {
      console.log(error);
    });
  // 将type加入依赖数组
}, [type]);

方案2:给路由元素添加key属性,强制组件重挂载

如果需要每次路由切换都完整重挂载ChartPage组件,可以给每个路由上的组件传入唯一的key属性,React识别到key变化时会自动卸载旧组件、挂载新组件,空依赖的useEffect也会随挂载流程重新执行。

修改app.js中的路由配置:

<Routes>
  <Route path="/" exact element={<Home />} />
  <Route path="/show-stocks" element={<ShowStocks />} />
  <Route
    path="show-stocks/bitcoin"
    element={<ChartPage key="btc" type={"BTC"} />}
  />
  <Route
    path="show-stocks/ethereum"
    element={<ChartPage key="eth" type={"ETH"} />}
  />
  <Route
    path="show-stocks/cardano"
    element={<ChartPage key="ada" type={"ADA"} />}
  />
</Routes>

注意:这种写法会丢失组件内部的所有状态,每次切换都会走完整的组件初始化流程,非必要场景优先使用方案1。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 20:15:52