2018-12-21路由

1.路由

React路由依賴于React Router已亥,React Router保持UI和與URL的同步誉券。它擁有簡單的API與強大的功能桂塞,如:代碼緩沖加載,動態(tài)路由匹配凉逛,建立正確的位置過渡處理性宏。

示例:

import React, { Component } from 'react'

import { render } from 'react-dom'

import { Router, Route, IndexRoute, Link, browserHistory } from 'react-router'

const ACTIVE = { color: 'red' }

class App extends Component {

? ? render() { return (<div><h1>我的路由</h1>

? ? ? ? ? ? ? ? <ul>

? ? ? ? ? ? ? ? ? ? <li><Link to="/" activeStyle={ACTIVE}>首頁</Link></li>

? ? ? ? ? ? ? ? ? ? <li><Link to="/users" activeStyle={ACTIVE}>用戶頁</Link></li>

? ? ? ? ? ? ? ? </ul>

? ? ? ? ? ? ? ? {this.props.children}

? ? ? ? ? ? </div>)}}

class Index extends React.Component {

? ? render() {return (<div><h2>Index!</h2></div>)}}

class Users extends React.Component {

? ? render() {return (<div><h2>Users</h2></div>)}}

render((

? ? <Router history={browserHistory}>

? ? ? ? <Route path="/" component={App}>

? ? ? ? ? ? <IndexRoute component={Index}/>

? ? ? ? ? ? <Route path="users" component={Users}></Route>

? ? ? ? </Route>

? ? </Router>

), document.getElementById('app'))

注意:react-router的版本v4.0與之前的版本變化較大,所以現(xiàn)在以最新v4.0的為準(zhǔn)状飞。并且react-router有react-router-dom和react-router-native之分毫胜,一個是web版本书斜,一個是移動App版本。

React-router有三大組件酵使,一個是Router荐吉,一個是Link,另外一個是Route凝化。

1)Router相當(dāng)于一個容器稍坯,不會被渲染出來,其他組件必須放到router中才能使用到react-router的功能搓劫。根據(jù)功能的不同,還分為BrowserRouter和MemoryRouter等

BrowserRouter主要使用在瀏覽器中混巧,它利用HTML5 的history API來同步URL和UI的變化枪向。當(dāng)我們點擊了程序中的一個鏈接之后,BrowserRouter就會找出與這個URL匹配的Route,并將他們渲染出來咧党。 既然BrowserRouter是用來管理我們的組件的秘蛔,那么它當(dāng)然要被放在最頂級的位置,而我們的應(yīng)用程序的組件就作為它的一個子組件而存在傍衡。

import * as React from 'react';

import * as ReactDOM from 'react-dom';

import { BrowserRouter } from 'react-router-dom';

ReactDOM.render(<BrowserRouter><app/></BrowserRouter>,document.body);

有時候我們的應(yīng)用只是整個系統(tǒng)中的一個模塊深员,比如一個使用了ASPNET MVC中的area的后臺管理模塊,應(yīng)用中的URL總是以?http://localhost/admin/?開頭蛙埂。這種情況下我們總不能每次定義Link和Route的時候都帶上admin吧倦畅?react-router已經(jīng)考慮到了這種情況,所以為我們提供了一個basename屬性绣的。為BrowserRouter設(shè)置了basename之后叠赐,Link中就可以省略掉admin了,而最后渲染出來的URL又會自動帶上admin屡江。

<BrowserRouter basename="/admin"/>

? ? <Link to="/home"/> // 被渲染為 <a href="/admin/home">?

</BrowserRouter>

2)Link被渲染成為一個a標(biāo)簽芭概,通常以聲明的方式被定義。

Link就像是一個個的路牌惩嘉,為我們指明組件的位置罢洲。Link使用聲明式的方式為應(yīng)用程序提供導(dǎo)航功能,定義的Link最終會被渲染成一個a標(biāo)簽文黎。Link使用to這個屬性來指明目標(biāo)組件的路徑惹苗,可以直接使用一個字符串,也可以傳入一個對象臊诊。

// 字符串參數(shù)查詢

<Link to="/query">查詢</Link>

// 對象參數(shù)

<Link to={{

? pathname: '/query',

? search: '?key=name',

? hash: '#hash'

}}>查詢</Link>

Link提供的功能并不多鸽粉,好在我們還有NavLink可以選擇。NavLink是一個特殊版本的Link抓艳,可以使用activeClassName來設(shè)置Link被選中時被附加的class触机,使用activeStyle來配置被選中時應(yīng)用的樣式。此外,還有一個exact屬性,此屬性要求location完全匹配才會附加class和style儡首。這里說的匹配是指地址欄中的URl和這個Link的to指定的location相匹配片任。

// 選中后被添加class selectedHome

<NavLink to={'/'} exact activeClassName='selected'>Home</NavLink>

// 選中后被附加樣式 color:red

<NavLink to={'/gallery'} activeStyle={{color:red}}>Gallery</NavLink>

3)Route包含一個path,并指明了path與URL匹配時渲染的組件蔬胯。

Route應(yīng)該是react-route中最重要的組件了对供,它的作用是當(dāng)location與Route的path匹配時渲染Route中的Component。如果有多個Route匹配氛濒,那么這些Route的Component都會被渲染产场。

與Link類似,Route也有一個exact屬性舞竿,作用也是要求location與Route的path絕對匹配京景。

// 當(dāng)location形如 http://location/時,Home就會被渲染骗奖。

// 因為 "/" 會匹配所有的URL确徙,所以這里設(shè)置一個exact來強制絕對匹配。

<Route exact path="/" component={Home}/>

<Route path="/about" component={About}/>

Route的三種渲染方式:

a) component?

b) render -?render的類型是function执桌,Route會渲染這個function的返回值鄙皇。因此它的作用就是附加一些額外的邏輯。

<Route path="/home" render={() => { return (<div>Home</div>);}/>

c) children -?這是最特殊的渲染方式仰挣。一伴逸、它同render類似,是一個function。不同的地方在于它會被傳入一個match參數(shù)來告訴你這個Route的path和location匹配上沒有椎木。二违柏、第二個特殊的地方在于,即使path沒有匹配上香椎,我們也可以將它渲染出來漱竖。秘訣就在于前面一點提到的match參數(shù)。我們可以根據(jù)這個參數(shù)來決定在匹配的時候渲染什么畜伐,不匹配的時候又渲染什么馍惹。

// 在匹配時,容器的calss是light玛界,<Home />會被渲染

// 在不匹配時万矾,容器的calss是dark,<About />會被渲染

<Route path='/home' children={({ match }) => (<div className={{match?'light':'dark'}>

?{match?<Home/>:<About/>} </div>)}/>

所有路由中指定的組件將被傳入以下三個props: match, location, history.

match.params.透過這個屬性慎框,我們可以拿到從location中解析出來的參數(shù)良狈。對應(yīng)的,我們的Route的path也要使用特殊的寫法笨枯。

如下示例薪丁,三個Link是一個文章列表中三個鏈接遇西,分別指向三篇id不同的文章。而Route用于渲染文章詳情頁严嗜。注意path='/p/:id' 粱檀,location中的對應(yīng)的段會被解析為id=1 這樣的鍵值。最終這個鍵值會作為param的鍵值存在漫玄。Route中的組件可以使用this.props.match.params.id來獲取茄蚯,示例中使用了結(jié)構(gòu)賦值。

<Link to='/p/1' />

<Link to='/p/2' />

<Link to='/p/3' />

<Route path='/p/:id' render={(match)=<h3>當(dāng)前文章ID:{match.params.id}</h3>)} />


Redirect

當(dāng)這個組件被渲染是睦优,location會被重寫為Redirect的to指定的新location渗常。它的一個用途是登錄重定向,比如在用戶點了登錄并驗證通過之后刨秆,將頁面跳轉(zhuǎn)到個人主頁

<Redirect to="/new"/>

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末凳谦,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子衡未,更是在濱河造成了極大的恐慌,老刑警劉巖家凯,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件缓醋,死亡現(xiàn)場離奇詭異,居然都是意外死亡绊诲,警方通過查閱死者的電腦和手機送粱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來掂之,“玉大人抗俄,你說我怎么就攤上這事∈澜ⅲ” “怎么了动雹?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長跟压。 經(jīng)常有香客問我胰蝠,道長,這世上最難降的妖魔是什么震蒋? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任茸塞,我火速辦了婚禮,結(jié)果婚禮上查剖,老公的妹妹穿的比我還像新娘钾虐。我一直安慰自己,他們只是感情好笋庄,可當(dāng)我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布效扫。 她就那樣靜靜地躺著倔监,像睡著了一般。 火紅的嫁衣襯著肌膚如雪荡短。 梳的紋絲不亂的頭發(fā)上丐枉,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天,我揣著相機與錄音掘托,去河邊找鬼瘦锹。 笑死,一個胖子當(dāng)著我的面吹牛闪盔,可吹牛的內(nèi)容都是我干的弯院。 我是一名探鬼主播,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼泪掀,長吁一口氣:“原來是場噩夢啊……” “哼听绳!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起异赫,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤椅挣,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后塔拳,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鼠证,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年靠抑,在試婚紗的時候發(fā)現(xiàn)自己被綠了量九。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡颂碧,死狀恐怖荠列,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情载城,我是刑警寧澤肌似,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站个曙,受9級特大地震影響锈嫩,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜垦搬,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一呼寸、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧猴贰,春花似錦对雪、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽馋艺。三九已至,卻和暖如春迈套,著一層夾襖步出監(jiān)牢的瞬間捐祠,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工桑李, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留踱蛀,地道東北人。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓贵白,卻偏偏與公主長得像率拒,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子禁荒,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,490評論 2 348

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