React-router4使用教程

此教程基于React Router 4.0

React-router和React-router-dom的選擇

很多剛使用react的同學在接觸到react-router的時候就會很蛋疼擎淤,什么react-router和react-router-dom淌铐?往往開始會比較懵逼。下面我們就來一探究竟相种。
React-router
React-router提供了一些router的核心api颅和,包括Router, Route, Switch等搓彻,但是它沒有提供dom操作進行跳轉(zhuǎn)的api空扎。
React-router-dom
React-router-dom提供了BrowserRouter, Route, Link等api,我們可以通過dom的事件控制路由浅缸。例如點擊一個按鈕進行跳轉(zhuǎn)枉疼,大多數(shù)情況下我們是這種情況皮假,所以在開發(fā)過程中鞋拟,我們更多是使用React-router-dom。安裝很簡單npm i react-router-dom --save,安裝了淘寶鏡像的就用cnpm吧惹资。

React Router 中文文檔 貌似不是最新的版本
React Router 英文文文檔

核心API

1.BrowserRouter
2.HashRouter
3.Route
4.Link
5.NavLink
6.MemoryRouter
7.Redirect
8.exact
9.Switch
10.withRouter
官方文檔解釋很詳細严卖,我就沒必要在new一次了,可以到官網(wǎng)學習具體用法布轿。

功能模塊

1.路由跳轉(zhuǎn)

<HashRouter>
    <App>
       <Switch>
           <Route exact path="/" component={Home} />
           <Route path="/about" component={About} />
           <Route path="/contact" component={Contact} />
       </Switch>
     </App>
</HashRouter>
App組件
import React, { Component } from 'react'
export default class App extends Component {
    render() {
        return (
            <div>
                {this.props.children}
            </div>
        )
    }
}
http://localhost:3000/#/哮笆,顯示Home組件內(nèi)容
http://localhost:3000/#/about,顯示About組件內(nèi)容
http://localhost:3000/#/contact汰扭,顯示Contact組件內(nèi)容

2.路由傳參和獲取
方法一:通過params
優(yōu)點:簡單快捷,并且稠肘,在刷新頁面的時候,參數(shù)不會丟失萝毛。
缺點:只能傳字符串项阴,并且,如果傳的值太多的話笆包,url會變得長而丑陋环揽。
如果,你想傳對象的話庵佣,可以用JSON.stringify(),想將其轉(zhuǎn)為字符串歉胶,然后另外的頁面接收后,用JSON.parse()轉(zhuǎn)回去巴粪。

**設置路由**
<Route path="/about/:id" component={About} />
**訪問方式**
<Link to={'/about/' + '2' }>About</Link>或者
this.props.history.push('/about/'+'2')
**about頁面獲取參數(shù)**
componentDidMount(){
    console.log(this.props.match.params.id);
}

方法二:通過query
優(yōu)點:優(yōu)雅通今,可傳對象
缺點:刷新頁面,參數(shù)丟失

**訪問方式**
<Link to={{pathname:'/contact',query:{id:'456'}}}>contact</Link>或者
this.props.history.push({pathname :'/contact',query :{id:'456'}})
**contact頁面獲取參數(shù)**
componentDidMount(){
   console.log(this.props.location.query.id);
}

方法三:通過state
優(yōu)點:優(yōu)雅肛根,可傳對象
缺點:刷新頁面辫塌,參數(shù)丟失

**訪問方式**
<Link to={{pathname:'/contact',query:{id:'456'}}}>contact</Link>或者
this.props.history.push({pathname :'/contact',query :{id:'456'}})
**contact頁面獲取參數(shù)**
componentDidMount(){
   console.log(this.props.location.state.id);
}

備注:如果想要http://localhost:3000/#/contact?sort=name&type=1這種形式傳參

this.props.history.push({pathname :'/contact',search:'?sort=name&type=1',query :{id:'456'}})
**contact頁面獲取參數(shù)**
this.props.location.search取參數(shù),然后在進行解析

3.路由重定向與404

重定向:<Route exact path="/" render={() => (<Redirect to="/home"/>)}/>
<Route component={NoMatch}/>
路由指定的所有路徑?jīng)]有匹配時派哲,就會加載這個NoMatch組件臼氨,也就是404頁面

4.嵌套路由
寫法一:

<Route path="/home" render={() =>
     <App>
         <Route path="/home/second" component={Second} />
    </App>
}/>

推薦寫法

在對應組件添加<Route path='/home/second' component={Second}/>

5.權(quán)限判斷
做管理后臺或者是其他項目,可能有部分頁面需要登錄才能訪問芭届,這就需要判斷有沒有登錄


const isAuthenticated = false;  //判斷登錄
function PrivateRoute({ component: Component, ...rest }) {
    return (
        <Route {...rest} render={
            props => isAuthenticated ? (<Component {...props} />) : (<Redirect to={{pathname: "/home"}}/>)
        }/>
    );
}

export default class router extends Component {
    render() {
        return (
            <HashRouter>
                <App>
                    <Switch>
                        <Route exact path="/" render={() => (<Redirect to="/home"/>)}/>
                        <Route path="/home" component={Home}/>
                        <Route path="/about/:id" component={About} />
                        <PrivateRoute path="/contact" component={Contact} />  
                        <Route component={NoMatch} />
                    </Switch>
                </App>
            </HashRouter>
        )
    }
}

6.按需加載

網(wǎng)絡的一個重要特點是我們不必讓訪問者在使用它之前下載整個應用程序储矩。您可以將代碼拆分視為逐步下載應用程序。要做到這一點喉脖,我們將使用的WebPack椰苟,@babel/plugin-syntax-dynamic-importreact-loadable抑月。

安裝:

npm i -D babel-plugin-syntax-dynamic-import
npm i -S react-loadable

實現(xiàn)按需加載核心代碼如下:


image.png

7.路由切換動畫
react-transition-group

教程相關代碼已上傳github树叽,如果幫助到你了麻煩點個star
react-router-demo

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市谦絮,隨后出現(xiàn)的幾起案子题诵,更是在濱河造成了極大的恐慌洁仗,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件性锭,死亡現(xiàn)場離奇詭異赠潦,居然都是意外死亡,警方通過查閱死者的電腦和手機草冈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進店門她奥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人怎棱,你說我怎么就攤上這事哩俭。” “怎么了拳恋?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵凡资,是天一觀的道長。 經(jīng)常有香客問我谬运,道長隙赁,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任梆暖,我火速辦了婚禮伞访,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘轰驳。我一直安慰自己咐扭,他們只是感情好,可當我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布滑废。 她就那樣靜靜地躺著蝗肪,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蠕趁。 梳的紋絲不亂的頭發(fā)上薛闪,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天,我揣著相機與錄音俺陋,去河邊找鬼豁延。 笑死,一個胖子當著我的面吹牛腊状,可吹牛的內(nèi)容都是我干的诱咏。 我是一名探鬼主播,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼缴挖,長吁一口氣:“原來是場噩夢啊……” “哼袋狞!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤苟鸯,失蹤者是張志新(化名)和其女友劉穎同蜻,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體早处,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡湾蔓,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了砌梆。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片默责。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖咸包,靈堂內(nèi)的尸體忽然破棺而出傻丝,到底是詐尸還是另有隱情,我是刑警寧澤诉儒,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布葡缰,位于F島的核電站,受9級特大地震影響忱反,放射性物質(zhì)發(fā)生泄漏泛释。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一温算、第九天 我趴在偏房一處隱蔽的房頂上張望怜校。 院中可真熱鬧,春花似錦注竿、人聲如沸茄茁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽裙顽。三九已至,卻和暖如春宣谈,著一層夾襖步出監(jiān)牢的瞬間愈犹,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工闻丑, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留漩怎,地道東北人。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓嗦嗡,卻偏偏與公主長得像勋锤,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子侥祭,可洞房花燭夜當晚...
    茶點故事閱讀 45,435評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 用兩張圖告訴你叁执,為什么你的 App 會卡頓? - Android - 掘金 Cover 有什么料茄厘? 從這篇文章中你...
    hw1212閱讀 12,744評論 2 59
  • React Router 4.0 (以下簡稱 RR4) 已經(jīng)正式發(fā)布,它遵循React的設計理念徒恋,即萬物皆組件蚕断。所...
    world_7735閱讀 1,522評論 0 2
  • 那一年 還沒有筆記本電腦 更沒有智能手機 我把少女的心事啊 寫進了整本日記 那一年 白衣勝雪 笑靨如花 卻愛迎風流...
    若愚談白閱讀 487評論 3 1