react-router中公共部分Header和SideBar的编写方式
初学react-router
,在项目中涉及登录页面是独立的,其他页面拥有共同的Header
和SideBar
组件,在这里把这两个公共部分封装到App
中。
一种实现方式,把App
通过import
到每个页面,对每个页面进行封装。
Routes定义如下:
<ConnectedRouter history={history}>
<div>
<Route exact path="/login" component={LoginPage} />
<Route exact path="/" component={privateRoute(App)} />
<Route path="/users" component={privateRoute(UserListPage)} />
<Route path="/chpwd" component={privateRoute(ChpwdPage)} />
<Route path="/user" component={privateRoute(User)} />
<Route path="/logout" onEnter={props.logout} />
</div>
</ConnectedRouter>
在调试时,发现在每个页面的render中需要用App
包装,比较繁琐,同时每个页面使用Router跳转时,
Header
和SideBar
组件在没有变化时,也在重复渲染。
如果使用下面方法编写Routes
,可以解决公共部分不需要重复渲染,同时每个页面不必用App
单独封装。
<ConnectedRouter history={history}>
<div>
<Route exact path="/login" component={LoginPage} />
<Route exact path="/" component={privateRoute(App)} />
<Route path="/app" component={privateRoute(App)} />
<Route path="/app/users" component={privateRoute(UserListPage)} />
<Route path="/app/chpwd" component={privateRoute(ChpwdPage)} />
<Route path="/app/user" component={privateRoute(User)} />
<Route path="/logout" onEnter={props.logout} />
</div>
</ConnectedRouter>
由于Route是可以多个同时匹配的一起使用,比如: ‘/app/users’, 会同时渲染’/app’和’/app/users’两个路由模块。在这里’/app’模块是公共部分,当无数据变化时,react可以自行判断避免重复渲染。
第三种方法是把路由嵌入到页面layout中,把对应路由放在页面对应的位置。
<Provider store={store}>
<ConnectedRouter history={history}>
<div id="application">
<Route exact path="/login" component={LoginPage} />
{devTools}
<HeaderPage />
<div className="container">
<nav className="nav left">
<LeftPage />
</nav>
{/* <TopMenu items={menuItems} /> */}
<section className="main">
<Route path="/users" component={privateRoute(UserListPage)} />
<Route path="/chpwd" component={privateRoute(ChpwdPage)} />
</section>
</div>
</div>
</ConnectedRouter>
</Provider>