react-router-dom初探

react-router是路由組件核心潦匈,而react-router-dom是在react-router的基礎(chǔ)上擴(kuò)展了dom組件Link、HashRouter等赚导。

1.react-router-dom安裝

npm install react-router-dom --save

2.基礎(chǔ)使用方法

直接貼代碼历等,首先需要從reacr-router-dom中引出所需的組件,這里采用hash模式路由辟癌,此次我再router.js文件中配置了路由規(guī)則寒屯,包括path和component,之后循環(huán)出路由組件黍少。其中switch組件用于選擇其下的匹配路由進(jìn)行展示寡夹,其中還包含Redirect重定向組件,當(dāng)所有的路由都無法匹配時(shí)厂置,會(huì)重定向到該組件配置的to路由菩掏。

// App.jsx
import React, {
  Component
} from 'react';
import router from './router/index';
import { HashRouter, Route, Switch, Redirect  } from 'react-router-dom';

class App extends Component {
  constructor(props) {
    super(props);
  }
  initRouter () {
    let routerList = router.map(item => (
      <Route
          component={item.component}
          exact
          key={item.path}
          path={item.path}
      ></Route>
    ));
    return routerList;
  }
  render () {
    return (
      <div className="App">
        <HashRouter>
          <Switch>
            {this.initRouter.bind(this)()}
            <Redirect
                path="/*"
                to="/home"
            ></Redirect>
          </Switch>
        </HashRouter>
      </div >
    );
  }
}

export default App;

以下為路由配置文件,其中引入了@loadable/component包用于路由懶加載昵济,優(yōu)化首頁加載速度

// router.js路由配置
// 路由懶加載方式
import loadable from '@loadable/component'

const router = [{
    path: '/home',
    component: loadable(() => import('../pages/HomePage'))
  },
  {
    path: '/detail',
    component: loadable(() => import('../pages/DetailPage'))
  }
];

export default router;

3.路由跳轉(zhuǎn)

方法一:使用react-router-dom提供的Link組件進(jìn)行跳轉(zhuǎn)

<Link to="/about">About</Link>

方法二:使用react-router-dom封裝的push智绸、goBack、go访忿、replace方法進(jìn)行跳轉(zhuǎn)

// 可以使用對(duì)象也可使用路徑path
this.props.history.push({
  pathname: '/detail'
});
this.props.history.push( '/detail');
// 類似vue的go
this.props.history.go(-1);
// 返回上一路由
this.props.history.goBack();
// 替換當(dāng)前路由防止出現(xiàn)死循環(huán)
this.props.history.replace('/detail');

4.路由傳參

方法一:params瞧栗,利用此方法傳遞的參數(shù)會(huì)保留在瀏覽器的地址欄,刷新頁面參數(shù)與任然存在海铆,從match中取值迹恐,建議采用這種方法。
<Route path='/path/:name/:id' component={Demo}/>
<link to="/path/lisi/2">xxx</Link>
this.props.history.push({pathname:"/path/" + name + id});
讀取參數(shù)用:this.props.match.params // { name: 'lisi', id:'2' }
方法二:query卧斟,此方法傳遞的參數(shù)不會(huì)存在于地址欄殴边,故刷新頁面參數(shù)會(huì)丟失,從location中取值珍语。
<Route path='/query' component={Demo}/>
<Link to={{ path : ' /query' , query : { name : 'lisi' }}}>
this.props.history.push({pathname:"/query",query: { name : 'lisi' }});
讀取參數(shù)用: this.props.location.query   // { name:'lisi' }
方法三:state锤岸,此方法和query方法相似,同樣是隱式傳遞板乙,從location中取值是偷,不會(huì)存在于地址欄,刷新頁面參數(shù)會(huì)丟失亡驰,但是state中的數(shù)據(jù)是加密傳輸?shù)南停^安全。
<Route path='/sort ' component={Demo}/>
<Link to={{ path : ' /sort ' , state : { name : 'lisi' }}}> 
this.props.history.push({pathname:"/sort ",state : { name : 'lisi' }});
讀取參數(shù)用: this.props.location.query  // { name:'lisi' }

5.使用react.lazy實(shí)現(xiàn)路由懶加載

前面我們利用的是loadable-components插件實(shí)現(xiàn)的路由懶加載凡辱,在react16.6.0后,react引入了lazy方法栗恩,用于動(dòng)態(tài)加載組件透乾,由此我們可以利用它來實(shí)現(xiàn)路由懶加載。

// 路由懶加載方式

// 利用loadable/component動(dòng)態(tài)加載組件
// import loadable from '@loadable/component'

// const router = [{
//     path: '/home',
//     component: loadable(() => import('../pages/HomePage'))
//   },
//   {
//     path: '/detail',
//     component: loadable(() => import('../pages/DetailPage'))
//   },
//   {
//     path: '/mobx',
//     component: loadable(() => import('../pages/testmobx'))
//   }
// ];

// 利用react.lazy動(dòng)態(tài)加載組件
import { lazy } from 'react'
const router = [{
  path: '/home',
  component: lazy(() => import('../pages/HomePage'))
},
{
  path: '/detail',
  component: lazy(() => import('../pages/DetailPage'))
},
{
  path: '/mobx',
  component: lazy(() => import('../pages/testmobx'))
}
];

export default router;

組件渲染,需要注意的是使用react.lazy動(dòng)態(tài)加載路由必須指定Suspense乳乌,并添加回調(diào)渲染組件捧韵,用于在加載組件過程中顯示loading效果,如果不指定該組件汉操,react會(huì)報(bào)錯(cuò)

import React, {
  Component,
  Suspense
} from 'react';
import router from './router/index';
import { HashRouter, Route, Switch, Redirect } from 'react-router-dom';

class App extends Component {
  initRouter () {
    let routerList = router.map(item => (
      <Route
        component={item.component}
        exact
        key={item.path}
        path={item.path}
      ></Route>
    ));
    return routerList;
  }
  render () {
    return (
      <div className="App">
        <HashRouter>
          <Suspense fallback={<div>Loading...</div>}>
            <Switch>
              {this.initRouter.bind(this)()}
              <Redirect
                path="/*"
                to="/home"
              ></Redirect>
            </Switch>
          </Suspense>
        </HashRouter>
      </div >
    );
  }
}

export default App;

6.使用react-router-config實(shí)現(xiàn)嵌套路由

react-router-config是為react-router寫的優(yōu)雅的配置路由表的插件
react-router-config地址

其實(shí)上面的路由也是采用路由配置的方式組織的再来,但是不夠優(yōu)雅,也不支持嵌套路由磷瘤,使用react-router-config將方便我們進(jìn)行路由嵌套配置芒篷。
1.修改路由配置表如下,其中Home組件下嵌套了TestMobx組件,并接收id參數(shù)

注意:嵌套路由的父組件(此處是Home組件)不可以添加 exact: true選項(xiàng)采缚,添加后會(huì)導(dǎo)致子路由無法匹配针炉,無法實(shí)現(xiàn)嵌套路由

const router = [{
    path: '/home',
    component: lazy(() => import('../pages/HomePage')),
    routes: [{
      path: '/home/mobx/:id',
      component: lazy(() => import('../pages/testmobx'))
    }]
  },
  {
    path: '/detail',
    component: lazy(() => import('../pages/DetailPage')),
    exact: true
  },
];

export default router;

2.修改路由組件利用renderRoutes 函數(shù)渲染route組件

import React, {
  Component,
  Suspense
} from 'react';
import router from './router/index';
import { HashRouter, Route, Switch, Redirect,Link } from 'react-router-dom';
import { renderRoutes } from "react-router-config";
class App extends Component {
  initRouter () {
    let routerList = router.map(item => (
      <Route
        component={item.component}
        exact
        key={item.path}
        path={item.path}
      ></Route>
    ));
    return routerList;
  }
  render () {
    return (
      <div className="App">
        <HashRouter>
          <ul>
            <li><Link to="/home">首頁</Link></li>
            <li><Link to="/detail">詳情頁</Link></li>
            <li><Link to="/home/mobx/123">嵌套</Link></li>
          </ul>
          <Suspense fallback={<div>Loading...</div>}>
            <Switch>
              {renderRoutes(router)}
              <Redirect
                path="/*"
                to="/home"
              ></Redirect>
            </Switch>
          </Suspense>
        </HashRouter>
      </div >
    );
  }
}

export default App;

3.想要實(shí)現(xiàn)嵌套,必不可少的我們需要在父級(jí)組件出添加renderRoutes渲染this.props.route.routes其中的子組件扳抽。

import React, { Component } from 'react';
import { Button } from 'antd';
import { renderRoutes } from "react-router-config";

class HomePage extends Component {
  render () {
    return (
      <div>
        <div >homePage</div>
        {/* 此處的routes應(yīng)該是配置中的子組件篡帕,如果路由配置中配置的children,那么這里就是 this.props.route.children*/}
        {renderRoutes(this.props.route.routes, { someProp: "these extra props are optional" })}
      </div>
    );
  }
}

export default HomePage;

7.router-react-dom相關(guān)鏈接

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末贸呢,一起剝皮案震驚了整個(gè)濱河市镰烧,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌楞陷,老刑警劉巖拌滋,帶你破解...
    沈念sama閱讀 211,639評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異猜谚,居然都是意外死亡败砂,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門魏铅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來昌犹,“玉大人,你說我怎么就攤上這事览芳⌒崩眩” “怎么了?”我有些...
    開封第一講書人閱讀 157,221評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵沧竟,是天一觀的道長铸敏。 經(jīng)常有香客問我,道長悟泵,這世上最難降的妖魔是什么杈笔? 我笑而不...
    開封第一講書人閱讀 56,474評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮糕非,結(jié)果婚禮上蒙具,老公的妹妹穿的比我還像新娘球榆。我一直安慰自己,他們只是感情好禁筏,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,570評(píng)論 6 386
  • 文/花漫 我一把揭開白布持钉。 她就那樣靜靜地躺著,像睡著了一般篱昔。 火紅的嫁衣襯著肌膚如雪每强。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,816評(píng)論 1 290
  • 那天州刽,我揣著相機(jī)與錄音空执,去河邊找鬼。 笑死怀伦,一個(gè)胖子當(dāng)著我的面吹牛脆烟,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播房待,決...
    沈念sama閱讀 38,957評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼邢羔,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了桑孩?” 一聲冷哼從身側(cè)響起拜鹤,我...
    開封第一講書人閱讀 37,718評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎流椒,沒想到半個(gè)月后敏簿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,176評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡宣虾,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,511評(píng)論 2 327
  • 正文 我和宋清朗相戀三年惯裕,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片绣硝。...
    茶點(diǎn)故事閱讀 38,646評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蜻势,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出鹉胖,到底是詐尸還是另有隱情握玛,我是刑警寧澤,帶...
    沈念sama閱讀 34,322評(píng)論 4 330
  • 正文 年R本政府宣布甫菠,位于F島的核電站挠铲,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏寂诱。R本人自食惡果不足惜拂苹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,934評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望刹衫。 院中可真熱鬧醋寝,春花似錦搞挣、人聲如沸带迟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽仓犬。三九已至嗅绰,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間搀继,已是汗流浹背窘面。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評(píng)論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留叽躯,地道東北人财边。 一個(gè)月前我還...
    沈念sama閱讀 46,358評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像点骑,于是被迫代替她去往敵國和親酣难。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,514評(píng)論 2 348

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

  • React Router 4.0 (以下簡(jiǎn)稱 RR4) 已經(jīng)正式發(fā)布黑滴,它遵循React的設(shè)計(jì)理念憨募,即萬物皆組件。所...
    梁相輝閱讀 97,377評(píng)論 24 195
  • 前言 react-router針對(duì)不同的使用場(chǎng)景衍生了不同的路由包袁辈,RN項(xiàng)目用react-router-nativ...
    大柚子08閱讀 36,464評(píng)論 5 39
  • React Router教程 React項(xiàng)目的可用的路由庫是React-Router,當(dāng)然這也是官方支持的菜谣。它也分...
    驚蟄_5269閱讀 300評(píng)論 0 0
  • React Router教程 React項(xiàng)目的可用的路由庫是React-Router,當(dāng)然這也是官方支持的。它也分...
    CLYDE_6715閱讀 266評(píng)論 0 0
  • React Router教程 React項(xiàng)目的可用的路由庫是React-Router,當(dāng)然這也是官方支持的晚缩。它也分...
    __db84閱讀 733評(píng)論 0 0