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

ReactJS点击图片路由跳转时两个组件同时渲染该如何解决?

问题成因
  • 路由规则配置层级错误:你将<Router>、列表内容、<Switch>全部写在了PhotosList组件内部,瀑布流容器、加载按钮这些内容没有被任何Route包裹,无论路由如何变化,这部分内容都会随PhotosList组件全局渲染,跳转到/details路径时自然会和ImageDetails组件同时展示。
  • 没有做路由级的组件切换:整个应用没有在根层级配置不同路由对应不同的页面组件,无法实现跳转路由时替换整个页面内容的效果。
修复方案

步骤1:调整App组件的路由配置

将Router、Switch和全量路由规则移到App根组件,分别配置根路径和详情路径对应的组件,给根路径路由添加exact属性避免模糊匹配。
修改后的App组件代码如下:

import { BrowserRouter as Router, Switch, Route } from "react-router-dom";
import PhotosList from './PhotosList';
import ImageDetails from './ImageDetails';

const App = () => {
  return (
    <div className="App">
      <header>Album</header>
      <Router>
        <Switch>
          {/* 根路径匹配图片列表页 */}
          <Route exact path="/" component={PhotosList} />
          {/* 详情路径匹配图片详情页 */}
          <Route exact path="/details" component={ImageDetails} />
        </Switch>
      </Router>
    </div>
  );
};

export default App;

步骤2:清理PhotosList组件的冗余路由代码

删除PhotosList内部的<Router>、<Switch>和详情页路由配置,仅保留列表页本身的业务代码,原有<Link>组件无需修改即可正常触发路由跳转。
修改后的PhotosList组件return代码如下:

return (
  <div className="layout">
    <Masonry gutter={"5 px"} columnsCount={3}>
      {photosList.map((photo: any) => (
        <Link to={"/details"} key={photo.id}>
          <img src={photo.download_url} alt={photo.author} />
        </Link>
      ))}
    </Masonry>

    <button onClick={loadMore} className="btn-grad">
      {isLoading ? "Loading..." : "Load More"}
    </button>
  </div>
);

扩展提示:如果需要在详情页获取对应图片的信息,可以将跳转路径修改为/details/${photo.id},同时把详情路由规则调整为/details/:id,即可在ImageDetails组件中通过路由参数拿到对应图片ID查询详情。

内容的提问来源于stack exchange,提问作者Menna T-Allah Magdy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 08:39:03