react-router學(xué)習(xí)整理

這篇文章是整理自己學(xué)習(xí)react-router的一些簡單用法和學(xué)習(xí)資料整理谍椅,用作自己的備忘錄同時分享弧械。

入門學(xué)習(xí)

官方示例

基礎(chǔ)用法

將官方示例克隆下來粗仓,運(yùn)行命令執(zhí)行起來蜕乡。
首先添加一個路由:打開入口js文件index.js

// render(<App/>, document.getElementById('app'))
render(<Router/>, document.getElementById('app'))

Router是一個組件奸绷,也就是react-router,改寫代碼:

render( 
    <Router history={hashHistory}>
        <Route path="/" component={App}/>
    </Router> 
,document.getElementById('app'))

現(xiàn)在我們看到和啟動前一樣的頁面层玲,我們可以試著多加幾個路由号醉。
新添加兩個組件

  • modules/About.js
  • modules/Repos.js
// modules/About.js
import React from 'react'

export default React.createClass({
  render() {
    return <div>About</div>
  }
})

新添加兩個路由

render( 
    <Router history={hashHistory}>
        <Route path="/" component={App}/>
        <Route path="/repos" component={Repos}/>
        <Route path="/about" component={About}/>
    </Router> 
,document.getElementById('app'))

Route組件定義了URL路徑與組件的對應(yīng)關(guān)系。
上面代碼中辛块,用戶訪問/repos(比如http://localhost:8080/#/repos)時畔派,加載Repos組件;訪問/about(http://localhost:8080/#/about)時憨降,加載About組件父虑。

Link

Link組件用于取代<a>元素,生成一個鏈接授药,允許用戶點(diǎn)擊后跳轉(zhuǎn)到另一個路由士嚎。
編輯modules/App.js

import { Link } from 'react-router'

export default React.createClass({
  render() {
    return <div>
      <ul role="nav">
        <li><Link to="/about">About</Link></li>
        <li><Link to="/repos">Repos</Link></li>
      </ul>
    </div>
  }
})

嵌套路由

之前在app上我們添加了兩個鏈接,相當(dāng)于導(dǎo)航的功能悔叽,但是導(dǎo)航應(yīng)該在每個頁面都應(yīng)該有莱衩。我們的應(yīng)用就像盒子,一個裝一個娇澎,我們的鏈接也是一層一層往下的笨蚁,假如給定url:/repos/123,我們的組件可能就像這樣:

<App>       {/*  /          */}
  <Repos>   {/*  /repos     */}
    <Repo/> {/*  /repos/123 */}
  </Repos>
</App>

react的鏈接和我們的組件(UI)是一致的,鏈接和UI組件的加載是一個層級關(guān)系括细,3級鏈接就會依次加載三個路由的組件伪很。
下面我們來實(shí)現(xiàn)公共導(dǎo)航:
首先我們書寫嵌套路由:

render( 
    <Router history={hashHistory}>
        <Route path="/" component={App}>
            {/* make them children of `App` */}
            <Route path="/repos" component={Repos}/>
            <Route path="/about" component={About}/>
        </Route>
    </Router> 
,document.getElementById('app'))

組件的嵌套關(guān)系,就像父子關(guān)系奋单,有孩子就有父锉试,嵌套內(nèi)的路由是外面一層的children,我們需要把這個子組件放在父組件對應(yīng)的位置:

// modules/App.js
// ...
  render() {
    return (
      <div>
        <h1>React Router Tutorial</h1>
        <ul role="nav">
          <li><Link to="/about">About</Link></li>
          <li><Link to="/repos">Repos</Link></li>
        </ul>

        {/* add this */}
        {this.props.children}

      </div>
    )
  }
// ...

現(xiàn)在看頁面览濒,就是鏈接切換時一直在頂部呆盖。只是替換了不同的子組件,像這樣:

// at /about
<App>
  <About/>
</App>

// at /repos
<App>
  <Repos/>
</App>

有了導(dǎo)航贷笛,我想給對應(yīng)導(dǎo)航添加當(dāng)前的樣式呢应又,react-router提供了activeStyleactiveClassName,直接添加內(nèi)聯(lián)樣式和添加類名來定義鏈接當(dāng)前樣式乏苦。
每次寫當(dāng)前樣式都需要加一個active株扛,有點(diǎn)麻煩,也不一定我們都記得邑贴,我們可以在Link上在封裝一層席里,作為導(dǎo)航鏈接。

// modules/NavLink.js
import React from 'react'
import { Link } from 'react-router'

export default React.createClass({
  render() {
    return <Link {...this.props} activeClassName="active"/>
  }
})

現(xiàn)在我們就可以這樣使用:

// modules/App.js
import NavLink from './NavLink'

// ...

<li><NavLink to="/about">About</NavLink></li>
<li><NavLink to="/repos">Repos</NavLink></li>

路由參數(shù)

路由路勁:paramName后的url會被作為參數(shù)拢驾,值可以在組件中解析this.props.params[name]奖磁,我們試試在示例中添加參數(shù)來理解一下:

render( 
    <Router history={hashHistory}>
        <Route path="/" component={App}>
            <Route path="/repos" component={Repos}/>
            <Route path="/about" component={About}/>
            <Route path="/repo/:userName/:repoName" component={Repo}/>
        </Route>
    </Router> 
,document.getElementById('app'))

然后新建一個組件:

import React from 'react'

export default React.createClass({
  render() {
    return (
      <div>
        <p>第一個鏈接參數(shù){this.props.params.userName}</p>
        <p>第二個鏈接參數(shù){this.props.params.repoName}</p>
      </div>
    )
  }
})

然后在鏈接上加一個鏈接試試:

<li><NavLink to="/repo/zhang/123">帶參數(shù)的鏈接</NavLink></li>
參數(shù)

路由中的參數(shù)名稱會成為對應(yīng)組件的屬性名稱。

IndexRoute

我們可以通過IndexRoute設(shè)置一個默認(rèn)加載的組件繁疤。
比如我們需要給應(yīng)用添加一個首頁咖为,我們添加一個默認(rèn)加載的組件:

import React from 'react'

export default React.createClass({
  render() {
    return <div>Home</div>
  }
})

然后運(yùn)用IndexRoute添加默認(rèn)加載的組件:

render( 
    <Router history={hashHistory}>
        <Route path="/" component={App}>
            <IndexRoute component={Home}/>
            <Route path="/repos" component={Repos}/>
            <Route path="/about" component={About}/>
            <Route path="/repo/:userName/:repoName" component={Repo}/>
        </Route>
    </Router> 
,document.getElementById('app'))

現(xiàn)在在http://localhost:8080/不僅會加載App組件,也會加載Home組件稠腊。

IndexLink

看看我們的例子躁染,現(xiàn)在我們沒有連接可以回到首頁,我們試著添加一個連接到首頁:

<li><NavLink to="/">Home</NavLink></li>     

然而這個Home連接一直在當(dāng)前狀態(tài)架忌,也就是一直是紅色狀態(tài)吞彤。因?yàn)?code>/是所有根路徑,所有的路徑都會匹配它叹放,所以他一直是紅色狀態(tài)饰恕。react-router提供了IndexLink來解決這個問題,用這個試試:

<li><IndexLink to="/" activeStyle={{ color: 'red' }}>Home</IndexLink></li>

history

history學(xué)習(xí)資料

高級用法

動態(tài)路由

對于大型應(yīng)用來說井仰,一個首當(dāng)其沖的問題就是所需加載的 JavaScript 的大小埋嵌。程序應(yīng)當(dāng)只加載當(dāng)前渲染頁所需的 JavaScript以及組件。
Route可以定義getChildRoute俱恶、getIndexRoute雹嗦、getComponents這幾個函數(shù)范舀。他們都是異步執(zhí)行的,并且只在需要時才被調(diào)用了罪。React Router 會逐漸的匹配 URL 并只加載該 URL 對應(yīng)頁面所需的路徑配置和組件锭环。

const CourseRoute = {
  path: 'course/:courseId',

  getChildRoutes(location, callback) {
    require.ensure([], function (require) {
      callback(null, [
        require('./routes/Announcements'),
        require('./routes/Assignments'),
        require('./routes/Grades'),
      ])
    })
  },

  getIndexRoute(location, callback) {
    require.ensure([], function (require) {
      callback(null, require('./components/Index'))
    })
  },

  getComponents(location, callback) {
    require.ensure([], function (require) {
      callback(null, require('./components/Course'))
    })
  }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市捶惜,隨后出現(xiàn)的幾起案子田藐,更是在濱河造成了極大的恐慌,老刑警劉巖吱七,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異鹤竭,居然都是意外死亡踊餐,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進(jìn)店門臀稚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來吝岭,“玉大人,你說我怎么就攤上這事吧寺〈芄埽” “怎么了?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵稚机,是天一觀的道長幕帆。 經(jīng)常有香客問我,道長赖条,這世上最難降的妖魔是什么失乾? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮纬乍,結(jié)果婚禮上碱茁,老公的妹妹穿的比我還像新娘。我一直安慰自己仿贬,他們只是感情好纽竣,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著茧泪,像睡著了一般蜓氨。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上调炬,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天语盈,我揣著相機(jī)與錄音,去河邊找鬼缰泡。 笑死稳捆,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的凿蒜。 我是一名探鬼主播扰柠,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼滤否!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤硝逢,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后绅喉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體渠鸽,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年柴罐,在試婚紗的時候發(fā)現(xiàn)自己被綠了徽缚。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡革屠,死狀恐怖凿试,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情似芝,我是刑警寧澤那婉,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站党瓮,受9級特大地震影響详炬,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜麻诀,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一痕寓、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蝇闭,春花似錦呻率、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至逻悠,卻和暖如春元践,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背童谒。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工单旁, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人饥伊。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓象浑,卻偏偏與公主長得像蔫饰,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子愉豺,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評論 2 354

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

  • Lesson11篓吁、首先確保安裝了Node.js和npm依賴包管理工具2、在git上克隆官方示例程序 git clo...
    冰_心閱讀 2,705評論 0 16
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,114評論 25 707
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理蚪拦,服務(wù)發(fā)現(xiàn)杖剪,斷路器,智...
    卡卡羅2017閱讀 134,656評論 18 139
  • 不小心把做的抑郁癥的視頻發(fā)在家庭群里 忘記解釋就睡了 早上起來看見我媽問我怎么了 別嚇?biāo)麄兪裁吹?突覺這就是代溝吧...
    木迎閱讀 318評論 0 0
  • 最近縈繞在腦海中驰贷、始終都揮之不去的一句話便是前幾天和嫂子聊天時盛嘿,她說的一句話:“我現(xiàn)在追求一種自我欣賞的...
    小盈得滿閱讀 535評論 0 1