【问题标题】:Hide header on some pages in react-router-dom在 react-router-dom 中的某些页面上隐藏标题
【发布时间】:2019-11-20 03:39:45
【问题描述】:

有没有一种方法可以只隐藏 React Router 中某些路由的页眉?我现在的问题是我的App 组件呈现了我的Main 组件,其中包含我的BrowserRouter,而我的Header 呈现在我的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;

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

【问题讨论】:

  • 您可以使用 Context/Provider/Consumer 来执行此操作,或者您可以更改您的逻辑并将页眉和页脚作为主页的子页面,而不是登录页面。您也可以使用专门针对带有 mobx 的 UI 的商店来做到这一点。
  • @kemicofa 如果我的页眉和页脚是主页的子页面而不是登录页面,它们不会在导航到另一个也有页眉和页脚的页面时重新呈现吗?
  • 是的,你是对的(但不是高性能且最简单的解决方案)。但是,如果您希望保留当前设置,请查看reactjs.org/docs/context.html(推荐)或github.com/mobxjs/mobx-react。他们都可以解决这个问题。您最终可以使用 refs,但这是反模式,最好远离。

标签: reactjs react-router react-router-dom react-dom


【解决方案1】:

您可以使用 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);

【讨论】:

    【解决方案2】:

    我最终使用了 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);
    

    【讨论】:

      【解决方案3】:

      你可以这样做:

      <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. 更干净地处理不同的路由组

      【讨论】:

        【解决方案4】:

        这对我有用:

        props 在我的类组件中不断返回 undefined

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

        【讨论】:

        • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-08-11
        • 2021-12-01
        • 1970-01-01
        • 2021-04-20
        • 2021-02-01
        • 2022-10-23
        • 1970-01-01
        相关资源
        最近更新 更多