React-Router-v4

react-router-v4

一茬末、簡介

一切皆組件

react-router在這個(gè)版本被拆分成了三個(gè)包

  • react-router (核心庫)
  • react-router-dom (瀏覽器環(huán)境)
  • react-router-native (react-native環(huán)境)

二厂榛、基本概念

  1. 安裝

基于web瀏覽器開發(fā)盖矫,所以只需要引入react-router-dom

npm install -S react-router-dom

or

yarn add react-router-dom
  1. 官方示例
  • 引入并擬寫基本結(jié)構(gòu)
import React from 'react'
import {BrowserRouter as Router,Route,Link} from 'react-router-dom'

const BasicExample = () => (
  <Router>
    <div>
      <ul>
        <li><Link to="/">首頁</Link></li>
        <li><Link to="/about">關(guān)于</Link></li>
        <li><Link to="/topics">主題列表</Link></li>
      </ul>

      <hr/>

      <Route exact path="/" component={Home}/>
      <Route path="/about" component={About}/>
      <Route path="/topics" component={Topics}/>
    </div>
  </Router>
)

注:
BrowserRouter(路由器)
Route(路由)
    exact:唯一匹配,僅匹配"/",否則會(huì)同時(shí)匹配"/"和"/xxx"
    path:路徑
    component:路徑匹配后所要渲染的組件
Link(鏈接 想象成<a>標(biāo)簽) 
  • Home及About組件實(shí)現(xiàn)
const Home = () => (
  <div>
    <h2>首頁</h2>
  </div>
)

const About = () => (
  <div>
    <h2>關(guān)于</h2>
  </div>
)
  • Topics及Topic組件實(shí)現(xiàn)
const Topics = ({ match }) => (
  <div>
    <h2>主題列表</h2>
    <ul>
      <li>
        <Link to={`${match.url}/rendering`}>
          使用 React 渲染
        </Link>
      </li>
      <li>
        <Link to={`${match.url}/components`}>
          組件
        </Link>
      </li>
      <li>
        <Link to={`${match.url}/props-v-state`}>
          屬性 v. 狀態(tài)
        </Link>
      </li>
    </ul>

    <Route path={`${match.url}/:topicId`} component={Topic}/>
    <Route exact path={match.url} render={() => (
      <h3>請(qǐng)選擇一個(gè)主題击奶。</h3>
    )}/>
  </div>
)

const Topic = ({ match }) => (
  <div>
    <h3>{match.params.topicId}</h3>
  </div>
)
注:
match(匹配Route加載的組件所獲取的一個(gè)對(duì)象參數(shù))
    isExact: 是否是全等匹配
    params: path正則解析后的值對(duì)象
    path: 路由的地址
    url: 與當(dāng)前l(fā)ocation路徑名所匹配部分

三辈双、基本概念

  • Router(路由器)

    • BrowserRouter (由服務(wù)器來管理動(dòng)態(tài)請(qǐng)求時(shí)使用,h5的history)
    • HashRouter (靜態(tài)網(wǎng)站柜砾,老版本瀏覽器的history)
    • MemoryRouter (主要用于服務(wù)器渲染湃望。它創(chuàng)建一個(gè)內(nèi)存中的history對(duì)象,不與瀏覽器URL互動(dòng))
  • <Route>(路由)

    • exact: propType.bool (是否是唯一匹配)

    • path: propType.string (路徑痰驱,如果沒有賦值证芭,則默認(rèn)渲染指定的component)

    • component: propType.func (常用)

    一個(gè)React組件。當(dāng)帶有component參數(shù)的route匹配成功后担映,route會(huì)返回一個(gè)新的元素废士,其為component參數(shù)所對(duì)應(yīng)的React組件(使用React.createElement創(chuàng)建)。

     例:
    Route path='/page' component={Page} />
    
    • render: propType.func (常用)

    當(dāng)?shù)刂菲ヅ涑晒笳{(diào)用該函數(shù)蝇完。該過程與傳入component參數(shù)類似官硝,并且對(duì)于行級(jí)渲染與需要向元素傳入額外參數(shù)的操作會(huì)更有用。最后返回一個(gè)React element短蜕。

     例:
    const extraProps = { color: 'red' }
    <Route path='/page' render={(props) => (
        <Page {...props} data={extraProps}/>
    )}/>
    
    • children:propType.func (不常用氢架,一般用在path無法匹配時(shí)呈現(xiàn)的'空'狀態(tài))

    一個(gè)返回React element的函數(shù)。與上述兩個(gè)參數(shù)不同朋魔,無論route是否匹配當(dāng)前l(fā)ocation岖研,其都會(huì)被渲染。

    <Route path='/page' children={(props) => (
        props.match
            ? <Page {...props}/>
            : <EmptyPage {...props}/>
    )}/>
    
    • 其他屬性看官方文檔
  • match(匹配Route加載的組件所獲取的一個(gè)對(duì)象參數(shù))

    • isExact: 是否是全等匹配
    • params: 由pathToRegexp解析path后所組成的一個(gè)對(duì)象
    //通過pathToRegexp解析path
    const match = re.exec(pathname)
    
    if (!match)
    return null
    
    const [ url, ...values ] = match
    const isExact = pathname === url
    
    //如果exact為true警检,需要pathname===url
    if (exact && !isExact)
        return null
    
    return {
        path, 
        url: path === '/' && url === '' ? '/' : url, 
          isExact, 
          params: keys.reduce((memo, key, index) => {
            memo[key.name] = values[index]
            return memo
          }, {})
    }
    
    pathToRegexp解析path:
    var keys = []
    var re = pathToRegexp('/foo/:bar', keys)
    // re = /^\/foo\/([^\/]+?)\/?$/i
    // keys = [{ name: 'bar', prefix: '/', delimiter: '/', optional: false, repeat: false, pattern: '[^\\/]+?' }]
    
    
    • path: 路由的地址
    • url: 與當(dāng)前l(fā)ocation路徑名所匹配部分
  • <Link>

    *URL會(huì)更新孙援,組件會(huì)被重新渲染,但是頁面不會(huì)重新加載

    • to:

    propType.string

    需要跳轉(zhuǎn)到的路徑(pathname)或地址(location)

    <Link to="/about">關(guān)于</Link>
    <Link to="/courses"/>
    

    propType.obj

    <Link to={{
        pathname: '/courses',
        search: '?sort=name',
        hash: '#the-hash',
        state: { fromDashboard: true }
    }}/>
    
    • replace: PropTypes.bool
    為 true 時(shí)解滓,點(diǎn)擊鏈接后將使用新地址替換掉訪問歷史記錄里面的原地址赃磨。
    為 false 時(shí),點(diǎn)擊鏈接后將在原有訪問歷史記錄的基礎(chǔ)上添加一個(gè)新的紀(jì)錄洼裤。
    默認(rèn)為 false邻辉。
    
    <Link to="/courses" replace />
    
  • <Switch>

    將僅渲染第一個(gè)匹配的路由

    import { Switch, Route } from 'react-router'
    
    <Switch>
      <Route exact path="/" component={Home}/>
      <Route path="/about" component={About}/>
      <Route path="/:user" component={User}/>
      <Route component={NoMatch}/>
    </Switch>
    

    否則會(huì)渲染所有匹配的路由

(End~)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市腮鞍,隨后出現(xiàn)的幾起案子值骇,更是在濱河造成了極大的恐慌,老刑警劉巖移国,帶你破解...
    沈念sama閱讀 219,539評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吱瘩,死亡現(xiàn)場離奇詭異,居然都是意外死亡迹缀,警方通過查閱死者的電腦和手機(jī)使碾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門蜜徽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人票摇,你說我怎么就攤上這事拘鞋。” “怎么了矢门?”我有些...
    開封第一講書人閱讀 165,871評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵盆色,是天一觀的道長。 經(jīng)常有香客問我祟剔,道長隔躲,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,963評(píng)論 1 295
  • 正文 為了忘掉前任物延,我火速辦了婚禮宣旱,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘叛薯。我一直安慰自己响鹃,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評(píng)論 6 393
  • 文/花漫 我一把揭開白布案训。 她就那樣靜靜地躺著,像睡著了一般粪糙。 火紅的嫁衣襯著肌膚如雪强霎。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,763評(píng)論 1 307
  • 那天蓉冈,我揣著相機(jī)與錄音城舞,去河邊找鬼。 笑死寞酿,一個(gè)胖子當(dāng)著我的面吹牛家夺,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播伐弹,決...
    沈念sama閱讀 40,468評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼拉馋,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了惨好?” 一聲冷哼從身側(cè)響起煌茴,我...
    開封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎日川,沒想到半個(gè)月后蔓腐,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,850評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡龄句,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評(píng)論 3 338
  • 正文 我和宋清朗相戀三年回论,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了散罕。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,144評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡傀蓉,死狀恐怖欧漱,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情僚害,我是刑警寧澤硫椰,帶...
    沈念sama閱讀 35,823評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站萨蚕,受9級(jí)特大地震影響靶草,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜岳遥,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評(píng)論 3 331
  • 文/蒙蒙 一奕翔、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧浩蓉,春花似錦派继、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至认轨,卻和暖如春绅络,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背嘁字。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評(píng)論 1 272
  • 我被黑心中介騙來泰國打工恩急, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人纪蜒。 一個(gè)月前我還...
    沈念sama閱讀 48,415評(píng)論 3 373
  • 正文 我出身青樓衷恭,卻偏偏與公主長得像,于是被迫代替她去往敵國和親纯续。 傳聞我的和親對(duì)象是個(gè)殘疾皇子随珠,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評(píng)論 2 355

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