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 */

 

posted on 2018-10-25 18:26  杨学友  阅读(150)  评论(0编辑  收藏  举报

导航