react-router-dom6.x版本使用

1、安裝依賴

npm i react-router-dom

2、引入實現(xiàn)路由所需的組件赚楚,以及頁面組件

import { BrowserRouter, Routes, Route } from 'react-router-dom';
import Foo from './Foo';
import Bar from './Bar';

function App(){
    return (
        <BrowserRouter>
            <Routes>
                <Route path='/foo' element={Foo} />
                <Route path='/bar' element={Bar} />
            </Routes>
        </BrowserRouter>
    )
}

注意:BrowserRouter組件最好放在最頂層所有組件之外,這樣能確保內(nèi)部組件使用Link做路由跳轉(zhuǎn)時不出錯

3煌恢、Switch 重命名為Routes (用法如上)

4骇陈、路由跳轉(zhuǎn)

在跳轉(zhuǎn)路由時,如果路徑是/開頭的則是絕對路由瑰抵,否則為相對路由你雌,即相對于“當前URL”進行改變

5、Link組件

Link組件只能在Router內(nèi)部使用二汛,因此使用到Link組件的組件一定要放在頂層的Router之內(nèi)

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

<Link to='foo'>to foo</Link>

6婿崭、NavLink組件

  • NavLink組件和Link組件的功能是一致的,區(qū)別在于可以判斷其to屬性是否是當前匹配到的路由
  • NavLink組件的styleclassName可以接收一個函數(shù)肴颊,函數(shù)接收一個isActive參數(shù)氓栈,可根據(jù)該參數(shù)調(diào)整樣式
import { NavLink } from 'react-router-dom';

function Foo(){
    return (
        <NavLink
            style={ (isActive) => ({color: isActive ? 'red' : '#fff'}) }
        >Click here</NavLink>
    )
}

7、Outlet (渲染任何匹配的子級路由頁面)

管理端(后臺)項目用這個api較為常見

return (
        <div className="A">
          <h3>我是A組件 --------- 編程式路由導(dǎo)航使用示例</h3>
          <div className="A-navBox">
            <Button type="primary" onClick={() => navigateRouter(1, 1, "i am Jason Ma")}>
              params傳參
            </Button>
            <Button onClick={() => navigateRouter(2, 18, "i am Jason Ma")}>search傳參</Button>
            <Button type="dashed" onClick={() => navigateRouter(3, 999, "i am Jason Ma")}>
              state傳參
            </Button>
          </div>

          {/* 渲染任何匹配的子級路由頁面 */}
          <Outlet></Outlet>
        </div>
  );

8婿着、獲取params參數(shù)

  • Route組件中的path屬性中定義路徑參數(shù)
  • 在組件內(nèi)通過useParams hook訪問路徑參數(shù)
<BrowserRouter>
    <Routes>
        <Route path='/foo/:id' element={Foo} />
    </Routes>
</BrowserRouter>

import { useParams } from 'react-router-dom';
export default function Foo(){
    const params = useParams();
    return (
        <div>
            <h1>{params.id}</h1>
        </div>
    )
}

在以前版本中授瘦,組件的props會包含一個match對象,在其中可以取到路徑參數(shù)竟宋。但在最新的6.x版本中提完,無法從props獲取參數(shù)。

并且丘侠,針對類組件的withRouter高階組件已被移除氯葬。因此對于類組件來說,使用參數(shù)有兩種兼容方法:

1.將類組件改寫為函數(shù)組件
2.自己寫一個HOC來包裹類組件婉陷,用useParams獲取參數(shù)后通過props傳入原本的類組件

9帚称、編程式路由導(dǎo)航用useNavigate代替useHistory(JS路由跳轉(zhuǎn))

使用useNavigate鉤子函數(shù)生成navigate對象,可以通過JS代碼完成路由跳轉(zhuǎn)秽澳,不可以在類組件中使用useNavigate函數(shù)闯睹,可以改成函數(shù)組件或者在外包裹一層withRouter來解決

// v5
import { useHistory } from 'react-router-dom';
 
 
function MyButton() {
  let history = useHistory();
  function handleClick() {
    history.push('/home');
  };
  return <button onClick={handleClick}>Submit</button>;
};

現(xiàn)在,history.push()將替換為navigation()

// v6
import { useNavigate } from 'react-router-dom';
 
 
function MyButton() {
  let navigate = useNavigate();
  function handleClick() {
    navigate('/home');
  };
  return <button onClick={handleClick}>Submit</button>;
};

history的用法也將被替換成:

// v5
history.push('/home');
history.replace('/home');
 
 
// v6
navigate('/home');
navigate('/home', {replace: true});

10担神、search參數(shù)

  • 查詢參數(shù)不需要在路由中定義
  • 使用useSearchParams hook來訪問查詢參數(shù)楼吃。其用法和useState類似,會返回當前對象和更改它的方法
  • 更改searchParams時妄讯,必須傳入所有的查詢參數(shù)孩锡,否則會覆蓋已有參數(shù)
import { useSearchParams } from 'react-router-dom';

// 當前路徑為 /foo?id=12
function Foo(){
    const [searchParams, setSearchParams] = useSearchParams();
    console.log(searchParams.get('id')) // 12
    setSearchParams({
        name: 'foo'
    }) // /foo?name=foo
    return (
        <div>foo</div>
    )
}

11、默認路由

定義: 在嵌套路由中亥贸,如果URL僅匹配了父級URL躬窜,則Outlet中會顯示帶有index屬性的路由

<Routes>
    <Route path='/foo' element={Foo}>
        <Route index element={Default}></Route>
        <Route path='bar' element={Bar}></Route>
    </Route>
</Routes>
  • 當url為/foo時:Foo中的Outlet會顯示Default組件
  • 當url為/foo/bar時:Foo中的Outlet會顯示為Bar組件
  • 注意:目前我的index無法設(shè)置默認子路由(可以用Navigite重定向?qū)崿F(xiàn)類似的默認功能,需要默認的路由設(shè)置一個指向子路由的重定向炕置,但是體驗會差一點荣挨,有點頓)

12栅受、全匹配路由

定義: path屬性取值為*時栋艳,可以匹配任何(非空)路徑,同時該匹配擁有最低的優(yōu)先級梭姓∥蠹可以用于設(shè)置404頁面崭孤。

<Routes>
    <Route path='/foo' element={Foo}>
        <Route path='bar' element={Bar}></Route>
        <Route path='*' element={NotFound}></Route>
    </Route>
</Routes>

13胀溺、多組路由

通常厘唾,一個應(yīng)用中只有一個Routes組件。

但根據(jù)實際需要也可以定義多個路由出口(如側(cè)邊欄和主頁面都要隨URL而變化)

<Router>
    <SideBar>
        <Routes>
            <Route></Route>
        </Routes>
    </SideBar>
    <Main>
        <Routes>
            <Route></Route>
        </Routes>
    </Main>
</Router>

14鹃操、重定向

當在某個路徑/a下韭寸,要重定向到路徑/b時,可以通過Navigate組件進行重定向到其他路徑
等價于以前版本中的Redirect組件

import { Navigate } from 'react-router-dom';
function A(){
    return (
        <Navigate to="/b" />
    )
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末组民,一起剝皮案震驚了整個濱河市棒仍,隨后出現(xiàn)的幾起案子悲靴,更是在濱河造成了極大的恐慌臭胜,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件癞尚,死亡現(xiàn)場離奇詭異耸三,居然都是意外死亡,警方通過查閱死者的電腦和手機浇揩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進店門仪壮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人胳徽,你說我怎么就攤上這事积锅。” “怎么了养盗?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵缚陷,是天一觀的道長。 經(jīng)常有香客問我往核,道長箫爷,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任聂儒,我火速辦了婚禮虎锚,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘衩婚。我一直安慰自己窜护,他們只是感情好,可當我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布非春。 她就那樣靜靜地躺著柄慰,像睡著了一般鳍悠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上坐搔,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天藏研,我揣著相機與錄音,去河邊找鬼概行。 笑死蠢挡,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的凳忙。 我是一名探鬼主播业踏,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼涧卵!你這毒婦竟也來了勤家?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤柳恐,失蹤者是張志新(化名)和其女友劉穎伐脖,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體乐设,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡讼庇,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了近尚。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蠕啄。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖戈锻,靈堂內(nèi)的尸體忽然破棺而出歼跟,到底是詐尸還是另有隱情,我是刑警寧澤格遭,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布哈街,位于F島的核電站,受9級特大地震影響如庭,放射性物質(zhì)發(fā)生泄漏叹卷。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一坪它、第九天 我趴在偏房一處隱蔽的房頂上張望骤竹。 院中可真熱鬧,春花似錦往毡、人聲如沸蒙揣。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽懒震。三九已至罩息,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間个扰,已是汗流浹背瓷炮。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留递宅,地道東北人娘香。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像办龄,于是被迫代替她去往敵國和親烘绽。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,044評論 2 355

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