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

标签 javascript reactjs react-router

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

app.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

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

跳过某些页面(例如主页和登录路由)的页眉和页脚呈现的最佳方法是什么?

最佳答案

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

公共(public)布局

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 布局

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

定义私有(private)路由:

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

关于javascript - 如何在 ReactJS 中跳过某些路由的页眉和页脚?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51796344/

相关文章:

javascript - 如何将组件对象传递给 React.js 中的容器?

javascript - React-router:将 props 传递给 es6 处理程序组件

reactjs - 为什么我的 NavLink 没有使用 Semantic-ui-react 设置为事件状态?

javascript - 在 android 上的样式选择上触发默认事件

javascript - 从嵌套对象数组中获取具有空值的对象

javascript - 从 React : am including Cloudinary unsigned preset but get "Upload preset must be specified when using unsigned upload" 上传 Cloudinary 图片

javascript - 刷新或按后退按钮后 AppBar 内容错误

reactjs - 使用material-ui制作侧边栏

javascript - 文档开头不允许使用 XML

javascript - react : 'Redirect' is not exported from 'react-router-dom'