React-router嵌套带有history.push的路由

时间:2019-01-04 10:01:08

标签: javascript reactjs react-router

我有一个反应页面,该页面根据当前路径呈现登录页面或导航栏+容器组件。我不希望导航栏在登录页面中可见。因此,我的应用程序的结构如下:

index.js

ReactDOM.render(<Main/>, document.getElementById('root'));

Main.js

<Router>
  <Switch>
    <Route path="/login" component={Login} />
    <PrivateRoute path="/" component={App} />
  </Switch>
</Router>

App.js

<Router>
  <div className="App">
    <Navbar/>
    <div className="main-container">
      <Switch>
        <Route exact path="/" component={Container1}/>
        <Route path="/route1" component={Container2}/>
        <Route path="/route2" component={Container3}/>
      </Switch>
    </div>
  </div>
</Router>

现在,如果要在任何容器组件内部执行this.props.history.push('/ login'),它只会影响最近的  因此不会在容器区域中渲染任何内容(因为没有路线匹配),而是保持导航栏可见。如何从Main.js中获取父来决定在程序化路线更改时呈现什么?我应该以其他方式构建应用程序吗?

谢谢。

2 个答案:

答案 0 :(得分:2)

技巧是删除App.js中多余的并在文件末尾使用withRouter(App)将其导出。谢谢Nenad Vracar

答案 1 :(得分:0)

您可以定义不同的路线集。将始终显示您的导航栏的默认路由,以及其他不会显示的路由。

class App extends React.Component{
    render(){
        const DefaultRoutes = () => {
            return(
                <div>
                    <Navbar/>
                    <Switch>
                        <Route path="/" component={Landing} exact={true}/>          
                    </Switch>                                                                                                           
                    <Footer/>
                </div>
            )
        }

        return(
            <Provider store={store}>
                <BrowserRouter>
                    <div className="App">
                        <Switch>
                            <Route path="/alternate" component={alternateComponent} exact/>
                            <Route component={DefaultRoutes}/>
                        </Switch>
                    </div>
                </BrowserRouter>
            </Provider>
        )
    }
}

因此,使用此设置,您可以看到DefaultRoutes将始终使用导航栏。 但是,路径为“备用”的Route则不是这样。本质上,只需将要具有“正常”显示行为的路由包装在DefaultRoutes中即可。并定义该集合之外的任何其他路径。这要归功于Switch,它可以独家呈现路线。