React的路由——react-router-dom

路由的安裝和引入

  1. 安裝

    cnpm i react-router-dom -S

  2. 引入

    • hash路由:HashRouter

      import { HashRouter } from 'react-router-dom'
      
    • history路由:BrowserRouter

      import { HistoryRouter } from 'react-router-dom'
      
  3. 注意

    路由的所有配置項必須在HashRouter或者BrowserRouter包裹范圍之內(nèi)

路由的配置

我們以HashRouter為示例:↓

路由的顯示

  1. 路由的顯示需要依賴 Route 組件逝淹,所以需要先進(jìn)行引入

    import { HashRouter,Route } from 'react-router-dom'
    
  2. 配置 Route 組件的配置項

    Route組件的參數(shù):

    • path:路由的匹配路徑

    • components:匹配成功后渲染的組件(值為組件名稱)

    • render:路徑匹配成功后渲染的組件的render方式 (值為一個函數(shù)翁锡,返回一個組件或標(biāo)簽)

    • exact:完全匹配

    // 引入所需的組件溜徙,用component方式渲染
    
    import Home from './components/home'
    import Classify from './components/classify'
    import Order from './components/Order'
    
    export default class App extends Component{
        render(){
            return (
             <HashRouter>
                 <Route path="/home" component={Home}></Route>
                    <Route path="/classify" component={Classify}></Route>
                    <Route path="/order" component={Order}></Route>
                </HashRouter>
            )
        }
    }
    
    
    // 或者用render的方式渲染
    // ...
    <HashRouter>
        <Route path="/home" render={()=><Home/>}></Route>
        <Route path="/classify" render={()=><Classify/>}></Route>
        <Route path="/order" render={()=><Order/>}></Route>
    </HashRouter>
    // ...
    

    如此一來,路由的最基本的功能就完成了。

    重點(diǎn)!!7耗瘛!S欢北滥!

    component方式和render方式的區(qū)別

    1. 用component渲染頁面的時候刚操,會默認(rèn)給渲染的組件傳遞三個值:history、match再芋、location菊霜。render需要手動給函數(shù)加參數(shù)(也可以通過withRouter來搞定):

      // 傳統(tǒng)寫法:
      <Route path="/home" render={({history,match,location})=>{
              return <Home history match location/>
          }}></Route>
      
      // 解構(gòu)傳值:
      <Route path="/detail" render={(props)=><Home {...props}/>}></Route>
      
    2. render 可以渲染組件,也可以渲染標(biāo)簽

    3. render 渲染的時候济赎,可以進(jìn)行傳值鉴逞。因?yàn)槭菢?biāo)簽,可以直接屬性傳值司训,props取值

    4. 一般情況下构捡,通過render 的形式進(jìn)行路由嵌套

    5. render 更自由,可以進(jìn)行更多的業(yè)務(wù)邏輯

withRouter 高階組件*

對 render 渲染的路由組件進(jìn)行加工壳猜,使其擁有history勾徽、match、location三個參數(shù)

引入:

import { withRouter } from 'react-router-dom'

使用:

{{/* 導(dǎo)出時用 withRouter 對創(chuàng)建的組件進(jìn)行加工统扳,則組件內(nèi)即可訪問history喘帚、match和location */}}
export default withRouter(MyComponent);

路由的跳轉(zhuǎn)方式

常規(guī)的路由的跳轉(zhuǎn)有以下的幾種方式:

  1. a標(biāo)簽

    a標(biāo)簽實(shí)現(xiàn)路由跳轉(zhuǎn)很簡單,我們并不需要做太多東西咒钟。

    <a href="#/home">首頁</a>
    <a href="#/classify">分類</a>
    
  2. Link (沒有選中標(biāo)識的導(dǎo)航)

    Link 跳轉(zhuǎn)是嵌入在 react-router-dom 里的吹由,所以需要先進(jìn)行引入。

    import { HashRouter,Route,Link } from 'react-route-dom'
    

    然后再進(jìn)行配置:

    // Link組件的跳轉(zhuǎn)路徑在 to 屬性里
    <Link to="/home">首頁</Link>
    <Link to="/classify">分類</Link>
    
  1. NavLink (導(dǎo)航欄跳轉(zhuǎn)——有選中標(biāo)識的導(dǎo)航)

    NanLink 和 Link 的區(qū)別不大朱嘴,依然是先進(jìn)行引入:

    import { HashRouter,Route,NavLink } from 'react-route-dom'
    

    然后進(jìn)行配置:

    // NavLink 組件的跳轉(zhuǎn)路徑也在 to 屬性里
    <NavLink to="/home">首頁</NavLink>
    <NanLink to="/classify">分類</NanLink>
    

    Link 組件不同的是倾鲫, NAVLink 組件在活躍項身上會有一個類名為 active 的標(biāo)識:

    動態(tài)類名

    于是可以在 active 中進(jìn)行相對應(yīng)的樣式編寫。

    配置項:

    1. to:需要跳轉(zhuǎn)的路徑
    2. activeClassName:活躍項的類名(默認(rèn)為 active
    3. activeStyle:活躍項的樣式
  2. 編程式導(dǎo)航

    如果用 this.props.history.xxx 的方式萍嬉,必須要有 history 參數(shù)乌昔,用 component 方式渲染的頁面默認(rèn)有,如果用 render 渲染帚湘,需要手動傳參玫荣。

    • this.props.history.push

      跳轉(zhuǎn)到

      this.props.history.push("/home");
      
    • this.props.history.goBack

      返回

      this.props.history.goBack();
      
    • this.props.history.goForward

    • this.props.history.go

    • this.props.history.replace

路由傳值

  1. 動態(tài)路由傳值(常用)

    • 在定義路由的時候通過 /:屬性 的方式來定義傳遞的屬性

      <Route to="/detail/:id" component={Detail}></Route>
      
  • 在路由跳轉(zhuǎn)的時候通過 /:值 的方式來傳遞數(shù)據(jù)

    <Link to="/detail/"+item.id>{item.name}</Link>
    
  • 在需要接受數(shù)據(jù)的頁面通過 this.props.match.params 來進(jìn)行接收

    <h2>接收到商品id為:{this.props.match.params.id}</h2>
    
  1. query傳值

    • 在路由跳轉(zhuǎn)的時候通過query傳值的方式進(jìn)行參數(shù)的傳遞

      <Link to="/detail?id="+item.id>{item.name}</Link>
      
  • 在需要接收數(shù)據(jù)的頁面通過 this.props.location.search 進(jìn)行接收

    <h2>接收到商品id為:{url.parse(this.props.location.search).query}</h2>
    
  1. 內(nèi)存?zhèn)髦担ㄗ约喝〉拿?/p>

    • 在路由跳轉(zhuǎn)的時候通過屬性對象的方式進(jìn)行參數(shù)的傳遞

      <Link to={{
              path:"/detail",
              // query的名字是自己取的
              query:{
                 id:item.id   
              }
          }}>{item.name}</Link>
      
  • jieshou this.props.location

    <h2>接收到商品id為:{this.props.location.query.id}</h2>
    

    因?yàn)檫@種方式把傳遞的值存在了對象里甚淡,所以刷新頁面后值會消失大诸,可以用于登錄返回頁面路徑的存儲

路由嵌套

路由如果要嵌套的話,父級路由必須要用 render 的方式來渲染贯卦,在函數(shù)內(nèi)對子級路由進(jìn)行操作资柔。

<Route path="/father" render={()=>{
        return (
            <Fragment>
                <Route component={Father}/> {/* 顯示父組件 */}
                <Route path="/father/childone" component={ChildOne}/>
                <Route path="/father/childtwo" component={ChildTwo}/>
            </Fragment>
        )
    }}></Route>
路由重定向——Redirect

路由重定向是由 Redirect 組件來完成的

import { Redirect } from 'react-router-dom'

//...

// 如果在 "/" 路徑,重定向到 "/home" 路徑
<Redirect from="/" to="/home" />
路由的單一匹配——Switch撵割,完全匹配——exact

首先引入 Switch 組件贿堰,然后直接包裹在作用范圍內(nèi)

import { Switch } from 'react-router-dom'

// 用 Switch 組件包裹你想要作用的路由
export default class App extends Component{
    render(){
        return (
            <HashRouter>
                <Switch>
                    {/* exact 表示精準(zhǔn)匹配,只有完全滿足路徑才會做相應(yīng)操作 */}
                    <Route path="/home" component={Home} exact/>
                    <Route path="/classify" component={Classify} />
                    <Route path="/order" component={Order} />
                </Switch>
            </HashRouter>
        )
    }
}
完整的路由嵌套:
{/* 一個完整的路由嵌套 */}
<Route path="/father" render={()=>(
    <Fragment>
        <Route component={Father}/>
        <Switch>
            <Redirect from="/father" to="/father/childone" exact />
            <Route path="/father/childone" component={ChildOne}/>
            <Route path="/father/childtwo" component={ChildTwo}/>
        </Switch>
    </Fragment>
)}></Route>

路由懶加載——react-loadable

使用路由的懶加載可以提升性能啡彬,增加Loading以提高用戶體驗(yàn)等

  1. 安裝

    cnpm i react-loadable -S

  2. 引入

    import loadable from 'react-loadable'
    
  3. 配置

    不用路由懶加載的時候羹与,組件是默認(rèn)的引入方式:

    import Home from './components/home'
    

    用路由懶加載引入組件:

    const Home = loadable({
        loader:()=>import("./components/home"),
        loading:Loading
        {/* Loading是自己的Loading組件 */}
    })
    
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末故硅,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子纵搁,更是在濱河造成了極大的恐慌吃衅,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件腾誉,死亡現(xiàn)場離奇詭異徘层,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)利职,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進(jìn)店門趣效,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人猪贪,你說我怎么就攤上這事跷敬。” “怎么了哮伟?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵干花,是天一觀的道長。 經(jīng)常有香客問我楞黄,道長池凄,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任鬼廓,我火速辦了婚禮肿仑,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘碎税。我一直安慰自己尤慰,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布雷蹂。 她就那樣靜靜地躺著伟端,像睡著了一般。 火紅的嫁衣襯著肌膚如雪匪煌。 梳的紋絲不亂的頭發(fā)上责蝠,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天,我揣著相機(jī)與錄音萎庭,去河邊找鬼霜医。 笑死,一個胖子當(dāng)著我的面吹牛驳规,可吹牛的內(nèi)容都是我干的肴敛。 我是一名探鬼主播,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼医男!你這毒婦竟也來了砸狞?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤镀梭,失蹤者是張志新(化名)和其女友劉穎趾代,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體丰辣,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡撒强,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了笙什。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片飘哨。...
    茶點(diǎn)故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖琐凭,靈堂內(nèi)的尸體忽然破棺而出芽隆,到底是詐尸還是另有隱情,我是刑警寧澤统屈,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布胚吁,位于F島的核電站,受9級特大地震影響愁憔,放射性物質(zhì)發(fā)生泄漏腕扶。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一吨掌、第九天 我趴在偏房一處隱蔽的房頂上張望半抱。 院中可真熱鬧,春花似錦膜宋、人聲如沸窿侈。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽史简。三九已至,卻和暖如春肛著,著一層夾襖步出監(jiān)牢的瞬間圆兵,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工策泣, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留衙傀,地道東北人抬吟。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓萨咕,卻偏偏與公主長得像,于是被迫代替她去往敵國和親火本。 傳聞我的和親對象是個殘疾皇子危队,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,060評論 2 355

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

  • 1. 后端路由與前端路由 多頁面應(yīng)用和后端路由在傳統(tǒng)的Web應(yīng)用中聪建,瀏覽器根據(jù)地址欄的URL向服務(wù)器發(fā)送一個HTT...
    ImmortalSummer閱讀 970評論 0 1
  • 1、區(qū)別 react-router:實(shí)現(xiàn)了路由的核心功能react-router-dom:基于react-rout...
    wl1105閱讀 6,637評論 0 2
  • React Router 4.0 (以下簡稱 RR4) 已經(jīng)正式發(fā)布茫陆,它遵循React的設(shè)計理念金麸,即萬物皆組件。所...
    梁相輝閱讀 97,462評論 24 195
  • React Router 4.0 (以下簡稱 RR4) 已經(jīng)正式發(fā)布簿盅,它遵循React的設(shè)計理念挥下,即萬物皆組件。所...
    world_7735閱讀 1,520評論 0 2
  • React-router VS React-router-dom 區(qū)別 React-router 提供了一些 ro...
    direwolf_閱讀 3,293評論 0 3