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

React.JS如何将路由页面的pageTitle props传递给NavBar组件展示

实现方案

你遇到的核心问题是<PageHeader>组件渲染在路由匹配的<Switch>外部,无法直接获取到各个页面组件内部的pageTitle属性,这里提供两种适配react-router-dom v5版本的实现方案:

方案一:状态提升同步标题

通过App组件的公共状态存储当前页面标题,每个页面加载时主动更新该状态:

  1. 在App组件中定义标题状态,传递给PageHeader和所有页面组件
import { useState } from 'react'
import {BrowserRouter as Router, Route, Switch } from "react-router-dom";
import Banany from "./Banany";
import Broskve from "./Broskve";
import PageHeader from "./Components/PageHeader";
import Home from "./Home";
import Hrusky from "./Hrusky";


function App() {
  // 定义公共状态存储当前页面标题
  const [currentPageTitle, setCurrentPageTitle] = useState('')
  return (
    <Router>
      {/* 把当前标题传给导航栏 */}
      <PageHeader title={currentPageTitle}/>

      <Switch>
        <Route exact path="/">
          {/* 传递修改标题的方法给页面组件 */}
          <Home pageTitle="Home" setPageTitle={setCurrentPageTitle}/>
        </Route>
        <Route path="/banany">
          <Banany pageTitle="Bananas" setPageTitle={setCurrentPageTitle}/>
        </Route>
        <Route path="/broskve">
          <Broskve pageTitle="Broskve" setPageTitle={setCurrentPageTitle}/>
        </Route>
        <Route path="/hrusky">
          <Hrusky pageTitle="Pears" setPageTitle={setCurrentPageTitle}/>
        </Route>
      </Switch>

    </Router>
  );
}

export default App;
  1. 在每个页面组件中,挂载时同步更新标题
    以Banany组件为例:
import { useEffect } from 'react'

function Banany(props) {
  // 组件挂载时更新公共标题状态
  useEffect(() => {
    props.setPageTitle(props.pageTitle)
  }, [props])

  // 原有组件逻辑
  return <div>Banany页面内容</div>
}
export default Banany
  1. 在PageHeader组件中直接渲染传入的title即可
function PageHeader(props) {
  return <nav>
    {/* 其他导航栏内容 */}
    <h1>{props.title}</h1>
  </nav>
}

方案二:抽离路由配置表(更易维护)

把所有路由的路径、组件、标题信息统一维护在配置表中,直接根据当前路径匹配对应标题,无需修改页面组件:

import { useLocation } from 'react-router-dom'
import {BrowserRouter as Router, Route, Switch } from "react-router-dom";
import Banany from "./Banany";
import Broskve from "./Broskve";
import PageHeader from "./Components/PageHeader";
import Home from "./Home";
import Hrusky from "./Hrusky";

// 统一维护路由配置
const routes = [
  {
    path: '/',
    exact: true,
    component: Home,
    title: 'Home'
  },
  {
    path: '/banany',
    component: Banany,
    title: 'Bananas'
  },
  {
    path: '/broskve',
    component: Broskve,
    title: 'Broskve'
  },
  {
    path: '/hrusky',
    component: Hrusky,
    title: 'Pears'
  }
]

function App() {
  const location = useLocation()
  // 匹配当前路径对应的路由配置,拿到标题
  const currentRoute = routes.find(route => {
    if (route.exact) {
      return location.pathname === route.path
    }
    return location.pathname.startsWith(route.path)
  })
  const currentPageTitle = currentRoute?.title || ''

  return (
    <Router>
      <PageHeader title={currentPageTitle}/>
      <Switch>
        {/* 遍历配置表渲染路由 */}
        {routes.map(route => (
          <Route 
            key={route.path} 
            path={route.path} 
            exact={route.exact}
            component={route.component}
            // 如果仍需要给页面组件传pageTitle可以用render方法
            // render={() => <route.component pageTitle={route.title} />}
          />
        ))}
      </Switch>
    </Router>
  );
}

export default App;

内容的提问来源于stack exchange,提问作者Filip Studený

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 03:15:03