想要对于如下页面实现:
当路由匹配到/main时,显示欢迎信息
点击其他某个菜单时,在右边的主体内容显示区域内,显示子页面的其他信息。
而之前已有代码都是统一的路由:
index.js中是:
<Router basename={SLASH_PUBLIC_PATH}> <Switch> <Route exact path={ROUTE_PREFIX.INDEX} component={Index} /> <Route exact path={ROUTE_PREFIX.LOGIN} component={Login} /> <Route exact path={ROUTE_PREFIX.MAIN} component={Main} /> </Switch> </Router> |
而Main中是完整的一个页面的内容,其中右边主体区域用的是一个div content-wrapper
return ( <BodyClassName className={this.generateCurBodyClass(this.state.isNaviBarCollapse)}> <div className="wrapper"> <HeaderBar curUserInfo={this.state.curUserInfo} toggleSideNaviBarCallback={this.toggleSideNaviBarCallback} /> <NavigationMenu /> <div className="content-wrapper"> <section className="content-header"> 。。。 </section> <section className="content"> xxx </div> <footer className="main-footer"> 。。。 </div> </BodyClassName> |
现在能想到的思路是:
改造Main页面,去根据匹配到的字路由,去显示不同的内容到content-wrapper中:
react-router v4 render sub page
javascript – Nested routes with react router v4 – Stack Overflow
reactjs – How to nest routes in React Router v4? – Stack Overflow
react-router v4 route component render
->
感觉这个block update是我要找的
Props are not passed by Route to components [v4] · Issue #4942 · ReactTraining/react-router
javascript – React router v4 render component inside element – Stack Overflow
react-router v4 Route render methods
react-router/Route.md at master · ReactTraining/react-router
react-router v4 block update
react-router/blocked-updates.md at master · ReactTraining/react-router
v4 Router.onUpdate removed · Issue #4278 · ReactTraining/react-router
Ditching Subscriptions in React Router – Paul Sherman – Medium
javascript – react-router 4 doesn’t update UI when clicking <Link> – Stack Overflow
reactjs – React router changes url but not view – Stack Overflow
react-router v4 nested routes
react-router v4 nested router
reactjs – How to nest routes in React Router v4? – Stack Overflow
javascript – Nested routes with react router v4 – Stack Overflow
【总结】
然后对于嵌套的Router(Route)的写法,早就写好了,但是始终页面无法跳转过来,最后调试半天,终于可以实现页面跳转了:
<Router basename=‘/rse_web’> <Switch> <Route exact path=‘/’ component={Index} /> <Route exact path=‘/login’ component={Login} /> <Route path=‘/main’ component={Main} /> </Switch> </Router> |
解释:
而之前之所以路由过去了,但是页面没有跳转,主要是Router下的Switch下的加了exact:
<Route exact path=‘/main’ component={Main} /> |
导致/main下面的页面无法匹配过去。
去掉这个Main的exact,就可以匹配下去了。
rse_web/src/pages/app.js
然后对于:
rse_web/src/pages/main/main.js
<div className="wrapper"> <HeaderBar curUserInfo={this.state.curUserInfo} toggleSideNaviBarCallback={this.toggleSideNaviBarCallback} /> <NavigationMenu /> <Switch> <Route exact path=’/main’ render={() => <div className="content-wrapper"> <p><span className="label label-primary">欢迎来到xxx后台管理系统</span></p> </div> } /> <Route path=’/main/progess_monitor’ component={ProcessMonitor} /> </Switch> <footer className="main-footer"> 。。。 </footer> </div> |
解释:
在Main中,不需要再加上:<Router>
只需要在<Route>外层加上:<Switch>,然后对于每个页面,使用适当的path,即可匹配到。
rse_web/src/components/navigation-menu/navigation-menu.js
<li className=’active’> <Link to={this.processMonitorRoute}> <i className="fa fa-square-o"></i> 进度监控 </Link> </li> |
解释:
在导航栏中,点击对应的菜单按钮,通过Link
(或者this.context.router.history.push
或者:this.props.history.push)
即可实现点击菜单按钮:
跳转页面:
【后记】
看到了:
A Simple React Router v4 Tutorial – Paul Sherman – Medium
抽空还要去参考:
import { Switch, Route } from ‘react-router-dom’ const Main = () => ( <main> <Switch> <Route exact path=’/’ component={Home}/> <Route path=’/roster’ component={Roster}/> <Route path=’/schedule’ component={Schedule}/> </Switch> </main> ) |
和:
const Roster = () => ( <Switch> <Route exact path=’/roster’ component={FullRoster}/> <Route path=’/roster/:number’ component={Player}/> </Switch> ) |
把自己的代码,继续优化为:
子页面路由,继续抽象出一个子页面的Component,专门负责子页面的路由。
-》
javascript – Nested routes with react router v4 – Stack Overflow
-》
React Router: Declarative Routing for React.js
其实官网都有例子了:
import React from ‘react’ import { BrowserRouter as Router, Route, Link } from ‘react-router-dom’ const BasicExample = () => ( <Router> <div> <ul> <li><Link to="/">Home</Link></li> <li><Link to="/about">About</Link></li> <li><Link to="/topics">Topics</Link></li> </ul> <hr/> <Route exact path="/" component={Home}/> <Route path="/about" component={About}/> <Route path="/topics" component={Topics}/> </div> </Router> ) const Home = () => ( <div> <h2>Home</h2> </div> ) const About = () => ( <div> <h2>About</h2> </div> ) const Topics = ({ match }) => ( <div> <h2>Topics</h2> <ul> <li> <Link to={`${match.url}/rendering`}> Rendering with React </Link> </li> <li> <Link to={`${match.url}/components`}> Components </Link> </li> <li> <Link to={`${match.url}/props-v-state`}> Props v. State </Link> </li> </ul> <Route path={`${match.url}/:topicId`} component={Topic}/> <Route exact path={match.url} render={() => ( <h3>Please select a topic.</h3> )}/> </div> ) const Topic = ({ match }) => ( <div> <h3>{match.params.topicId}</h3> </div> ) export default BasicExample |
只是自己之前没看到而已。