繁体   English   中英

如何跳过 ReactJS 中某些路由的页眉和页脚?

[英]How to skip header and footer for certain routes in ReactJS?

我有以下代码,它为所有页面呈现一个带有页眉和页脚的应用程序。

应用程序.js

import React from 'react';
import {
  Route,
  Switch
} from 'react-router-dom';
import { ConnectedRouter } from 'connected-react-router'
import Layout from './components/Layout'
import Home from './homeComponent';
import Login from './loginComponent';
import Dashboard from './dashboardComponent';

const App = ({ history }) => {
  return (
    <Layout>
        <ConnectedRouter history={history}>
            <Switch>
              <Route exact={true} path="/" component={Home} />
              <Route path="/login" component={Login} />
              <Route path="/dashboard" component={Dashboard} />
              ... more routes
              <Route component={NoMatch} />
            </Switch>
        </ConnectedRouter>
    </Layout>
  );
};

export default App;

布局.js

import Header from './headerComponent'
import Footer from './footerComponent'
import React, {Component} from 'react'

class Layout extends Component {
    render() {
        return (
            <div>
                <Header />
                {this.props.children}
                <Footer />
            </div>
        )
    }
}

跳过某些页面(如 Home 和 Login 路由)的页眉和页脚渲染的最佳方法是什么?

我建议创建两个具有自己的页眉和页脚以及私有路由的布局:

公共布局

export const PublicLayout = (props) => <div>
<PublicHeader/>
  <Switch>
    <Route exact path="/" component={HomePage}/>
    <Route exact path='/signin' component={SigninForm} />
    <Route exact path='/signup' component={Signup} />         
  </Switch>
<PublicFooter/>

受保护的布局

export const ProtectedLayout = (props) => <div>
<ProtectedHeader/>
 <Switch>
   <PrivateRoute exact path='/app/dashboard' component={Dashboard} />
   <Route component={NotFound} />
 </Switch>
<ProtectedFooter/>

在 app.js 中定义高级路由:

export default () => {
  return <div>
    <Switch>
      <Route path='/app' component={ProtectedLayout} />
      <Route path='/' component={PublicLayout} />
    </Switch>
  </div>
}

定义私有路由:

export default ({component: Component, ...rest}) => (
  <Route {...rest} render={props => (
    window.globalState.isAuthenticated() ? (
      <Component {...props} />
    ) : (
      <Redirect to={{
        pathname: '/signin',
        state: {from: props.location}
      }} />
    )
  )} />
)

是的,我知道的有点晚。

视觉工作室 2019

import React from 'react';
import { Container } from 'reactstrap';
import NavMenu from '../components/NavMenu';

export default props => (
    <div>
        {window.location.pathname !== '/login' ? <NavMenu /> : null}        
        <Container>
            {props.children}
        </Container>
    </div>
);

我希望有人帮助那里.. !!! 快乐编码

我在解决问题的同时做了一些解决方案。

首先,您可以将Switch包装在网站页眉和页脚中

<BrowserRouter>

    <WebsiteHeader />

    <Switch>
        <Route/>
        <Route/>
        <Route/>
    </Switch>

    <WebsiteFooter/>

<BrowserRouter>

然后在页眉或页脚内使用来自'react-router-dom' withRouter包装组件,以便您可以访问路由道具

const WebsiteHeader = props => {
    if (props.location.pathname == "/register") return null;
    return (
        <Fragment>
            <DesktopHeader {...props} />
            <MobileHeader {...props} />
        </Fragment>
    );
};

export default withRouter(WebsiteHeader);

使用render

<ConnectedRouter history={history}>
  <Switch>
    <Route path="/dashboard" render={props => <Layout><Dashboard {...props} /></Layout>} />
    <Route path="/login" component={Login} />
  </Switch>
</ConnectedRouter>

用于强制刷新路由内的 Header。 使用 forceRefresh={true}

const Routing = () => {
    return(
        <BrowserRouter forceRefresh={true}>
        <Header/>
        <Switch>
                <Route exact path="/" component={Home}/>
                <Route path="/list/:id" component={ListingApi}/>
                <Route path="/details/:id" component={HotelDetails}/>
                <Route path="/booking/:hotel_name" component={PlaceBooking}/>
                <Route path="/viewBooking" component={ViewBooking}/>
                <Route exact path="/login" component={LoginComponent}/>
                <Route  path="/signup" component={RegisterComponent}/>
        </Switch>
        <Footer/>
        </BrowserRouter>
    )
}

我只会创建一些不同的布局,一种带有页眉和页脚,另一种没有。 然后,而不是将所有内容都包装到一个布局中。 我只是在每个页面组件中进行包装。 所以你的组件会是这样的:

仪表板组件

<SimpleLayout>
  <Dashboard>
</SimpleLayout>

主页组件

<MainLayout>
  <Home>
</MainLayout>

像这样尝试

<Route path="/" render={(props) => (props.location.pathname !== "/login") && 
    <Header />}>
</Route>

<Route path="/" render={(props) => (props.location.pathname !== "/login") && 
  <Menu />}> 
</Route>

<PrivateRoute path="/scope" component={Scope}  ></PrivateRoute>

<Route exact path="/login" component={Login} />

在这个例子中,我正在检查 URL,如果 URL 是“/Login”,我将删除菜单标题组件

用于强制刷新路由内的 Header。

const Routing = () => {
    return(
        <BrowserRouter forceRefresh={true}>
        <Header/>
        <Switch>
                <Route exact path="/" component={Home}/>
                <Route path="/list/:id" component={ListingApi}/>
                <Route path="/details/:id" component={HotelDetails}/>
                <Route path="/booking/:hotel_name" component={PlaceBooking}/>
                <Route path="/viewBooking" component={ViewBooking}/>
                <Route exact path="/login" component={LoginComponent}/>
                <Route  path="/signup" component={RegisterComponent}/>
        </Switch>
        <Footer/>
        </BrowserRouter>
    )
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM