第五章 React 路由
三、基本路由使用
7. 代码 - Switch 的使用
7.1 Test
import React, { Component } from 'react' export default class Test extends Component { render ( ) { return ( < div> < h2> Test... . < / h2> < / div> ) }
}
7.2 App
import React, { Component } from "react" ;
import { Route, Switch } from "react-router-dom" ;
import Home from "./pages/Home" ;
import About from "./pages/About" ;
import Test from "./pages/Test" ;
import Header from "./components/Header" ;
import MyNavLink from "./components/MyNavLink" ; export default class App extends Component { render ( ) { return ( < div> < div className= "row" > < div className= "col-xs-offset-2 col-xs-8" > < Header / > < / div> < / div> < div className= "row" > < div className= "col-xs-2 col-xs-offset-2" > < div className= "list-group" > < MyNavLink to= "/about" > About< / MyNavLink> < MyNavLink to= "/home" > Home< / MyNavLink> < / div> < / div> < div className= "col-xs-6" > < div className= "panel" > < div className= "panel-body" > { } < Switch> < Route path= "/about" component= { About} / > < Route path= "/home" component= { Home} / > < Route path= "/home" component= { Test} / > < / Switch> < / div> < / div> < / div> < / div> < / div> ) ; }
}
7.3 总结
1 .通常情况下,path和component是一一对应的关系。
2 .Switch可以提高路由匹配效率( 单一匹配) 。
8. 代码 - 解决样式丢失问题
8.1 index
<! DOCTYPE html >
< html> < head> < meta charset = " UTF-8" /> < title> React App</ title> < link rel = " icon" href = " %PUBLIC_URL%/favicon.ico" /> < link rel = " stylesheet" href = " /css/bootstrap.css" > < style> .alex { background-color : rgb ( 209, 137, 4) !important ; color : white !important ; } </ style> </ head> < body> < div id = " root" > </ div> </ body>
</ html>
8.2 App
import React, { Component } from "react" ;
import { Route, Switch } from "react-router-dom" ;
import Home from "./pages/Home" ;
import About from "./pages/About" ;
import Header from "./components/Header" ;
import MyNavLink from "./components/MyNavLink" ; export default class App extends Component { render ( ) { return ( < div> < div className= "row" > < div className= "col-xs-offset-2 col-xs-8" > < Header / > < / div> < / div> < div className= "row" > < div className= "col-xs-2 col-xs-offset-2" > < div className= "list-group" > < MyNavLink to= "/alex/about" > About< / MyNavLink> < MyNavLink to= "/alex/home" > Home< / MyNavLink> < / div> < / div> < div className= "col-xs-6" > < div className= "panel" > < div className= "panel-body" > { } < Switch> < Route path= "/alex/about" component= { About} / > < Route path= "/alex/home" component= { Home} / > < / Switch> < / div> < / div> < / div> < / div> < / div> ) ; }
}
8.3 总结
1 .public/index.html 中 引入样式时不写 ./ 写 / (常用)
2 .public/index.html 中 引入样式时不写 ./ 写 %PUBLIC_URL% (常用)
3 .使用HashRouter
9. 代码 - 路由的模糊匹配与严格匹配
9.1 App
import React, { Component } from "react" ;
import { Route, Switch } from "react-router-dom" ;
import Home from "./pages/Home" ;
import About from "./pages/About" ;
import Header from "./components/Header" ;
import MyNavLink from "./components/MyNavLink" ; export default class App extends Component { render ( ) { return ( < div> < div className= "row" > < div className= "col-xs-offset-2 col-xs-8" > < Header / > < / div> < / div> < div className= "row" > < div className= "col-xs-2 col-xs-offset-2" > < div className= "list-group" > < MyNavLink to= "/about" > About< / MyNavLink> < MyNavLink to= "/home" > Home< / MyNavLink> < / div> < / div> < div className= "col-xs-6" > < div className= "panel" > < div className= "panel-body" > { } < Switch> < Route exact path= "/about" component= { About} / > < Route exact path= "/home" component= { Home} / > < / Switch> < / div> < / div> < / div> < / div> < / div> ) ; }
}
9.2 总结
1 .默认使用的是模糊匹配(简单记:【输入的路径】必须包含要【匹配的路径】,且顺序要一致)
2 .开启严格匹配:< Route exact = { true} path = "/about" component = { About} />
3 .严格匹配不要随便开启,需要再开,有些时候开启会导致无法继续匹配二级路由
10. 代码 - Redirect 的使用
10.1 App
import React, { Component } from "react" ;
import { Route, Switch, Redirect } from "react-router-dom" ;
import Home from "./pages/Home" ;
import About from "./pages/About" ;
import Header from "./components/Header" ;
import MyNavLink from "./components/MyNavLink" ; export default class App extends Component { render ( ) { return ( < div> < div className= "row" > < div className= "col-xs-offset-2 col-xs-8" > < Header / > < / div> < / div> < div className= "row" > < div className= "col-xs-2 col-xs-offset-2" > < div className= "list-group" > < MyNavLink to= "/about" > About< / MyNavLink> < MyNavLink to= "/home" > Home< / MyNavLink> < / div> < / div> < div className= "col-xs-6" > < div className= "panel" > < div className= "panel-body" > { } < Switch> < Route path= "/about" component= { About} / > < Route path= "/home" component= { Home} / > < Redirect to= "/about" / > < / Switch> < / div> < / div> < / div> < / div> < / div> ) ; }
}
10.2 总结
1 .一般写在所有路由注册的最下方,当所有路由都无法匹配时,跳转到Redirect指定的路由
2 .具体编码:< Switch> < Route path = "/about" component = { About} /> < Route path = "/home" component = { Home} /> < Redirect to = "/about" /> < /Switch>
四、嵌套路由使用
1. 效果
2. 代码
2.1 News
import React, { Component } from "react" ; export default class News extends Component { render ( ) { return ( < ul> < li> news001< / li> < li> news002< / li> < li> news003< / li> < / ul> ) ; }
}
2.2 Message
import React, { Component } from "react" ; export default class Message extends Component { render ( ) { return ( < div> < ul> < li> < a href= "/message1" > message001< / a> & nbsp; & nbsp; < / li> < li> < a href= "/message2" > message002< / a> & nbsp; & nbsp; < / li> < li> < a href= "/message3" > message003< / a> & nbsp; & nbsp; < / li> < / ul> < / div> ) ; }
}
2.3 Home
import React, { Component } from "react" ;
import MyNavLink from "../../components/MyNavLink" ;
import { Route, Switch, Redirect } from "react-router-dom" ;
import News from "./News" ;
import Message from "./Message" ; export default class index extends Component { render ( ) { return ( < div> < h3> 我是Home的内容< / h3> < div> < ul className= "nav nav-tabs" > < li> < MyNavLink to= "/home/news" > News< / MyNavLink> < / li> < li> < MyNavLink to= "/home/message" > Message< / MyNavLink> < / li> < / ul> { } < Switch> < Route path= "/home/news" component= { News} / > < Route path= "/home/message" component= { Message} / > < Redirect to= "/home/news" / > < / Switch> < / div> < / div> ) ; }
}
3. 总结
1 .注册子路由时要写上父路由的path值
2 .路由的匹配是按照注册路由的顺序进行的