简体   繁体   English

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

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

I have the following code which renders an app with a header and footer for all pages.我有以下代码,它为所有页面呈现一个带有页眉和页脚的应用程序。

app.js应用程序.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;

layout.js布局.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>
        )
    }
}

What is the best way to skip rendering of the header and footer for certain pages like Home and Login routes?跳过某些页面(如 Home 和 Login 路由)的页眉和页脚渲染的最佳方法是什么?

I'd recommend creating two layouts with their own header and footers and a private route:我建议创建两个具有自己的页眉和页脚以及私有路由的布局:

Public Layout公共布局

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/>

Protected Layout受保护的布局

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

Define high-level routes in app.js:在 app.js 中定义高级路由:

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

Define PrivateRoute:定义私有路由:

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

Yeah i know a bit late .是的,我知道的有点晚。

Visual studio 2019视觉工作室 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>
);

i hope somebody helps out there.. !!!我希望有人帮助那里.. !!! Happy coding快乐编码

I made some solution while solving the problem.我在解决问题的同时做了一些解决方案。

First You can wrap the Switch in a website header and footer首先,您可以将Switch包装在网站页眉和页脚中

<BrowserRouter>

    <WebsiteHeader />

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

    <WebsiteFooter/>

<BrowserRouter>

then inside the header or footer wrap the components using withRouter from 'react-router-dom' so you can access the routes props然后在页眉或页脚内使用来自'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);

Use render使用render

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

For forcefully refresh Header inside routing.用于强制刷新路由内的 Header。 use forceRefresh={true}使用 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>
    )
}

I would just create a few different layouts one with header and footer and one without.我只会创建一些不同的布局,一种带有页眉和页脚,另一种没有。 And then instead of wrapping everything into one layout.然后,而不是将所有内容都包装到一个布局中。 I'd just do this wrapping inside each page component.我只是在每个页面组件中进行包装。 So your components would be like:所以你的组件会是这样的:

Dashboard component仪表板组件

<SimpleLayout>
  <Dashboard>
</SimpleLayout>

Home component主页组件

<MainLayout>
  <Home>
</MainLayout>

Try like this像这样尝试

<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} />

In this example I'm checking the URL, If the URL is "/Login" I'm removing Menu and header component在这个例子中,我正在检查 URL,如果 URL 是“/Login”,我将删除菜单标题组件

For forcefully refresh Header inside routing.用于强制刷新路由内的 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