react基础(6)—— 路由
##########################################################
“遇到喜欢的人,就像浩劫余生,漂流过沧海,终见陆地。”
##########################################################
1,什么是路由?
路由是根据不同的 url 地址展示不同的内容或页面。
2,React Router
版本——4(万物皆组件,以前的版本不都是组件)
一个针对React而设计的路由解决方案、可以友好的帮你解决React components 到URl之间的同步映射关系。
3,安装React router
npm install react-router
npm install react-router-dom(这个包依赖于上面的这个包)
4,准备react组件
import { HashRouter as Router, Route,Redirect, Switch } from "react-router-dom";
//export {BrowserRouter, Route, Link,.....} 上面的导出的方式,所以是这样的导入
import React from "react";//必须引入react 为了 解析jsx
准备好之后,就可以import相应的路由,然后设置相应跳转了
5,定义路由
HashRouter当点击一个标签的时候会有warning,可以通过BrowserRouter
Route 是进行路由跳转组件
Redirect是重定向组件
Switch是解决无线循环问题的组件
1 import App from "../App"; 2 import Home from "../components/Home" 3 import Film from "../components/Film" 4 import Nowplaying from "../components/Film/Nowplaying" 5 import Comingsoon from "../components/Film/Comingsoon" 6 import Card from "../components/Card" 7 import Detail from "../components/Detail" 8 9 10 11 const router= ( 12 <Router> 13 14 <App> 15 <Switch> 16 {/*switch作用- 只渲染匹配路径的第一个孩子*/} 17 <Route path="/home" component={Home}/> 18 {/*<Route path="/film" component={Film}/>*/} 19 <Route path="/film" render={()=> 20 <Film> 21 <Switch> 22 <Route path="/film/nowplaying" component={Nowplaying}/> 23 <Route path="/film/comingsoon" component={Comingsoon}/> 24 <Redirect from="/film" to="/film/nowplaying"/> 25 </Switch> 26 </Film> 27 }/> 28 <Route path="/card" component={Card}/> 29 30 {/* <Route path="/card" render={()=> 31 false?<Card/>:<Redirect to="/home"/> 32 }/>*/} 33 {/*<Route path="/card" render={()=> 34 false?<Card/>:<Home/> 35 }/>*/} 36 <Route path="/detail/:kerwinid" component={Detail}/> 37 38 <Redirect from="*" to="/home"/> 39 </Switch> 40 </App> 41 </Router> 42 ) 43 44 export default router;
6,Link && NavLink
功能:点击之后,根据路由规则,然后跳转,(<a/>不需要路由)
-eg:<li><NavLink to="/home" activeClassName="active">home</NavLink></li>
Link和NavLink的区别就是NavLink可以加高亮,Link没有高亮
7,路由容器
{
//属性有一个特殊的children
this.props.children
}
然后就可以根据路由,和跳转规则在这个区域里面显示不同的内容了
8,路由嵌套
看上面代码实例,可以看到,路由是可以嵌套的(也就是二级路由)
复述:
1 <Route path="/film" render={()=> 2 <Film> 3 <Switch> 4 <Route path="/film/nowplaying" component={Nowplaying}/> 5 <Route path="/film/comingsoon" component={Comingsoon}/> 6 <Redirect from="/film" to="/film/nowplaying"/> 7 </Switch> 8 </Film> 9 }/>
<div> film页面 {this.props.children} </div>
9,动态路由
1 <Route path="/detail/:xueyou" component={Detail}/>
这个代码就是动态路由(上面代码实例中有)
1 <li key={item.id} onClick={()=>{ 2 this.props.history.push(`/detail/${item.id}`) 3 }} />
通过上面代码触发动态路由
1 <div> 2 detail-{this.props.match.params.xueyou} 3 </div>
在detail组件中通过上面代码接受到,动态路由传过来的id,然后通过id,发送ajax,请求详情页面的信息,动态创建页面
10,路由拦截
有的时候,我们并不希望用户进入到该页面(比如未登陆的用户),这个时候我们就需要路由拦截功能。
这个实现方法有很多,这里面介绍一个比较不错的方法
在路由里面进行判断设置 —— —— 判断用户到底可以进入哪一个页面:
1 <Route path="/card" render={()=> 2 false?<Card/>:<Redirect to="/home"/> 3 }/>
11,react-redux路由——Provider
<Provider></Provider>包裹在根组件外面,让所有组件都能获取到store中的状态,就不需要导入了import store from "../../store";
1 import { HashRouter as Router, Route,Redirect, Switch } from "react-router-dom"; 2 import React from "react";//必须引入react 为了 解析jsx 3 // export {BrowserRouter, Route, Link,.....} 4 import App from "../App"; 5 import Home from "../components/Home" 6 import Film from "../components/Film" 7 import Nowplaying from "../components/Film/Nowplaying" 8 import Comingsoon from "../components/Film/Comingsoon" 9 import Card from "../components/Card" 10 import Detail from "../components/Detail" 11 12 import {Provider} from "react-redux"; 13 import store from "../store"; 14 const router= ( 15 16 <Provider store={store}> 17 <Router> 18 19 <App> 20 <Switch> 21 {/*switch作用- 只渲染匹配路径的第一个孩子*/} 22 <Route path="/home" component={Home}/> 23 {/*<Route path="/film" component={Film}/>*/} 24 <Route path="/film" render={()=> 25 <Film> 26 <Switch> 27 <Route path="/film/nowplaying" component={Nowplaying}/> 28 <Route path="/film/comingsoon" component={Comingsoon}/> 29 <Redirect from="/film" to="/film/nowplaying"/> 30 </Switch> 31 </Film> 32 }/> 33 <Route path="/card" component={Card}/> 34 35 {/* <Route path="/card" render={()=> 36 false?<Card/>:<Redirect to="/home"/> 37 }/>*/} 38 {/*<Route path="/card" render={()=> 39 false?<Card/>:<Home/> 40 }/>*/} 41 <Route path="/detail/:kerwinid" component={Detail}/> 42 43 <Redirect from="*" to="/home"/> 44 </Switch> 45 </App> 46 </Router> 47 48 </Provider> 49 ) 50 51 export default router; 52 53 /* 54 vue, 路由模式 55 (1) hash #/home mode:"hash" 56 (2) history /home mode:"history" 57 58 59 React , 路由模式 60 (1) hash #/home <HashRouter> 61 (2) history /home <BrowserRouter> 62 63 hash => bom (window.onhashchange=function(){}) location.hash="#/film" 64 history=>bom (window.onpopstate= function(){}) h5 state pushState("/film") 65 66 */