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

React.js中如何根据不同组件渲染对应header和footer?

问题诊断
  • React Router v6 中如果父路由对应的组件内部还有独立的<Routes>配置,父路由的path必须添加*通配符用于前缀匹配。你当前App.js中两个父路由都只写了精确匹配路径,只有访问/和/mega根路径时能渲染对应布局,访问/article1、/mega/series等子路径时无法匹配到父路由,自然不会渲染布局和内部子路由内容。
  • exact属性在React Router v6中已经废弃,路由默认是精确匹配规则,不需要额外添加。
  • Mega_Blog内部的路由写了绝对路径/mega前缀,虽然不是错误,但可以直接用相对路径简化写法。
修复现有代码的方案

1. 修改App.js代码

class App extends Component {
  render() {
    return ( 
      <>
        <Router>
          <Routes>
            {/* 加*通配符匹配所有/开头的子路径 */}
            <Route path="/*" element={<Simple_Blog />} />       
            {/* 加*通配符匹配所有/mega开头的子路径 */}
            <Route path="/mega/*" element={<Mega_Blog/>} />      
          </Routes>
        </Router>
      </>
    );
  }
}
export default App 

2. 可选:简化布局组件内的路由路径

以Mega_Blog.js为例,因为父路由已经是/mega前缀,内部路由可以直接写相对路径,删去冗余的exact属性:

class Mega_Blog extends Component {
  render() {
    return (
      <>
        <MegaHeader />
        <Routes>
          <Route path="" element={<Index/>}/>
          <Route path="series" element={<Home/>}/>
          <Route path="article-whats-new" element={<Article_New/>}/>
        </Routes> 
        <MegaFooter />  
      </>
    );
  }
}
export default Mega_Blog 

Simple_Blog.js同理删去exact属性即可。

更推荐的公共布局方案(嵌套路由写法)

不需要每个布局组件内部写Routes,统一在App.js配置路由结构,用Outlet组件承载子路由内容,结构更清晰易维护,是React Router v6官方推荐的多布局实现方案:

1. 改造布局组件,添加Outlet占位

以Simple_Blog.js为例:

import { Outlet } from 'react-router-dom';
class Simple_Blog extends Component {
  render() {
    return (
      <>
        <SimpleHeader />
        {/* 子路由内容会渲染到这里 */}
        <Outlet />
        <SimpleFooter />  
      </>
    );
  }
}
export default Simple_Blog 

Mega_Blog.js同理替换内部的Routes为<Outlet />。

2. App.js统一配置所有路由

class App extends Component {
  render() {
    return ( 
      <>
        <Router>
          <Routes>
            {/* Simple博客嵌套路由 */}
            <Route path="/" element={<Simple_Blog />}>
              <Route index element={<LaunchScreen/>}/>
              <Route path="article1" element={<Article1/>}/>
            </Route>
            {/* Mega博客嵌套路由 */}
            <Route path="/mega" element={<Mega_Blog/>}>
              <Route index element={<Index/>}/>
              <Route path="series" element={<Home/>}/>
              <Route path="article-whats-new" element={<Article_New/>}/>
            </Route>    
          </Routes>
        </Router>
      </>
    );
  }
}
export default App 

这种写法所有路由规则统一管理,不需要每个布局单独维护路由,后续新增页面直接在对应父路由下加子路由即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 04:24:01