在 react-router-dom 中的某些页面上隐藏标题

IT技术 reactjs react-router react-router-dom react-dom
2021-04-30 12:33:23

有没有办法可以只为 React Router 中的某些路由隐藏我的页眉?我现在的问题是我的App组件呈现我的Main组件,其中包含 my BrowserRouter,而 myHeader在我的App组件中呈现,所以我无法根据路由路径呈现标题。

这是一些代码:

App.js

import React from 'react';
import {BrowserRouter} from 'react-router-dom';
import Main from './Main';
import Header from './Header';
import Footer from './Footer';

const App = () => (
    <BrowserRouter>
        <Header/>
        <Main/>
        <Footer/>
    </BrowserRouter>
);

export default App;

Main.js

import React from 'react';
import {Route, Switch} from 'react-router-dom';
import Home from './Home';
import Login from './Login';

const Main = () => (
    <main>
        <Switch>
            <Route exact path='/' component={Home}/>
            <Route exact path='/login' component={Login}/>
        </Switch>
    </main>
);

export default Main;

在此应用程序中,我想隐藏登录页面上的页眉和页脚。

4个回答

您可以使用 withRouter 高阶组件来访问 App 组件中的 props.location 对象,并使用以下命令检查用户是否在登录或注册页面上 props.location.pathname

import {BrowserRouter, withRouter} from 'react-router-dom'
const App = () => (
   <BrowserRouter>

     {
      props.location.pathname!=='/login' ? <Header/>:null
     }
        <Main/>
        <Footer/>

   </BrowserRouter>
);

export default withRouter(App);

我最终使用了 Redux。这是最好的选择,因为我有超过 20 页(下面的代码中只显示了 3 页),所有这些页的页眉/页脚的可见性各不相同。我为页眉创建了一个减速器,为页脚创建了一个减速器。这是我的解决方案:

import ...

class App extends React.Component {
    render() {
        return (
            <BrowserRouter>
                {this.props.header ? <Header/> : ''}
                <Switch>
                    <Route exact path='/' component={Home}/>
                    <Route exact path='/login' component={Login}/>
                    <Route exact path='/signup' component={Signup}/>
                </Switch>
                {this.props.footer ? <Footer/> : ''}
            </BrowserRouter>
        );
    }
}

const mapStateToProps = state => state;
export default connect(mapStateToProps)(App);

你可以这样做:

<Switch>
          {authRoutes.map(({ path, component: C }) => (
            <Route
              key={`${C}-route`}
              path={path}
              render={(props) => (
                <div className="app__activePage">
                  <C {...props} />
                </div>
              )}
            ></Route>
          ))}

          {routes.map(({ path, component: C }) => (
            <Route
              key={`${C}-route`}
              path={path}
              render={(props) => (
                <div className="app__activePage">
                  <Header />
                  <C {...props} />
                </div>
              )}
            ></Route>
          ))}
</Switch>

我通常在另一个文件中定义我的所有路由并按组导出它们。这使我能够:

  1. 在一处定义所有路由
  2. 更干净地处理不同的路由组

这对我有用:

props 在我的类组件中一直未定义

{window.location.pathname !== "/app" ? (
          <NavBar />
) : null}