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

为什么React嵌套路由组件未跳转新页面而是渲染在上一页面内容后

问题原因

你当前的路由结构属于典型的嵌套路由设计,Playlists 组件内同时存在播放列表卡片列表和子路由渲染逻辑,当路由匹配到/playlists/:playlistId时,父路由/playlists仍然处于匹配状态,所以整个Library、Playlists组件都会完整渲染,子路由对应的Playlist组件自然就追加在列表内容之后,不会单独替换页面内容。

解决方案

方案1:保留嵌套路由结构,实现点击后替换列表内容展示详情

修改Playlists.js代码,加入Switch组件和路由精确匹配规则,让同一时间只渲染列表或者详情:

import { Switch, Route } from "react-router-dom";

const Playlists = () => {
  const PlaylistContext = useContext(playlistContext);
  const { playlists } = PlaylistContext;
  const { url, path } = useRouteMatch();

  return (
    <section className="playlist-container">
      <Switch>
        {/* 精确匹配/playlists时渲染卡片列表 */}
        <Route exact path={path}>
          {playlists.map((playlist) => (
            <Link to={`${url}/${playlist.id}`} key={playlist.id}>
              <PlaylistCard cardDetails={playlist} />
            </Link>
          ))}
        </Route>
        {/* 匹配到id时只渲染详情组件 */}
        <Route path={`${path}/:playlistId`}>
          <Playlist />
        </Route>
      </Switch>
    </section>
  );
};

export default Playlists;

方案2:将详情路由提升到根路由配置,完全独立页面

如果不需要嵌套结构,直接在App.js的Switch中新增详情路由,注意要放在/playlists路由之前,避免被提前匹配:

// App.js 中修改Switch部分
<Switch>
  <Route exact path="/">
    <Home />
  </Route>
  <Route exact path="/favourites">
    <Favourites />
  </Route>
  <Route exact path="/playlistForm">
    <PlaylistForm />
  </Route>
  {/* 新增详情路由,放在/playlists之前 */}
  <Route exact path="/playlists/:playlistId">
    <Playlist />
  </Route>
  <Route exact path="/playlists">
    <Library />
  </Route>
</Switch>

之后删除Playlists.js里的子路由相关代码即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 10:57:02