react 路由 v6 路由跳轉(zhuǎn)和路由嵌套

1. 路由環(huán)境配置

react-router-dom 版本要在 v6 以上

  1. 安裝依賴
npm install react-router-dom -S
  1. 在入口 index.js 引入督笆,并使用路由模式組件包裹根組件
    根據(jù)需求選擇 HashRouter 還是 BrowserRouter,默認(rèn)是 BrowserRouter
import { BrowserRouter } from "react-router-dom";

ReactDOM.render(
  <BrowserRouter>
    <App />
  </BrowserRouter>,
  document.getElementById("root")
);

注意:

路由模式
hash 模式: HashRouter
histroy 模式: BrowserRouter
其中 hash 模式 url 路徑上顯示 # 族吻,histroy 模式需要后端配合配置

2. 路由跳轉(zhuǎn)的幾種方式

1. Link澳腹、NavLink

在 App.js 中眶蕉,通過 Link 或者 NavLink 組件,進(jìn)行導(dǎo)航跳轉(zhuǎn)

import React from "react";
import { Link, Route, Routes } from "react-router-dom";
import Child1 from "./components/Child1";
import Child2 from "./components/Child2";
function App(props) {
  console.log(props);
  return (
    <div>
      <div>
        {/* link 導(dǎo)航 */}
        {/* 也使用 NavLink孵稽,相比link 它多了一個點擊時的 active 類句狼,可以設(shè)置點擊時樣式 */}
        <Link to="/child1">Link: go to child1</Link> |{" "}
        <Link to="/child2">Link: go to child2</Link>
      </div>
      <div>
        {/* 定義路由出口 */}
        <Routes>
          {/* 根組件默認(rèn)展示 */}
          {/* <Route path="/" element={<Child1 />} /> */}
          {/* 路由重定向 */}
          <Route path="/" element={<Navigate to="/Child1" />} />

          <Route path="/child1" element={<Child1 />} />
          <Route path="/child2" element={<Child2 />} />
        </Routes>
      </div>
    </div>
  );
}

export default App;

2. navigate() 路由跳轉(zhuǎn)

在 App.js 中笋熬,通過 react-router-dom 中的 useNavigate() 方法,進(jìn)行編程式導(dǎo)航跳轉(zhuǎn)
注意:withRouter 在 react-router-dom v6 版本中已被棄用

import React from "react";
import { Route, Routes, useNavigate } from "react-router-dom";
import Child1 from "./components/Child1";
import Child2 from "./components/Child2";
function App() {
  const navigate = useNavigate();
  return (
    <div>
      <div>
        {/* 編程式導(dǎo)航導(dǎo)航 */}
        <button
          onClick={() => {
            navigate("/child1");
          }}
        >
          onClick: go to child1
        </button>
        <button
          onClick={() => {
            navigate("/child2");
          }}
        >
          onClick: go to child2
        </button>
      </div>
      <div>
        {/* 定義路由出口 */}
        <Routes>
          {/* 根組件默認(rèn)展示 */}
          {/* <Route path="/" element={<Child1 />} /> */}
          {/* 路由重定向 */}
          <Route path="/" element={<Navigate to="/Child1" />} />

          <Route path="/child1" element={<Child1 />} />
          <Route path="/child2" element={<Child2 />} />
        </Routes>
      </div>
    </div>
  );
}

export default App;

3. navigate(path,{replace: true}) 路由跳轉(zhuǎn)腻菇,清除歷史記錄

此方式跳轉(zhuǎn)會刪除歷史記錄胳螟,使用和傳參方式和 navigate() 相同,只是增加 {replace: true}參數(shù)
Link組件也可以使用 replace 方式筹吐,只需要在Link標(biāo)簽上添加 replace 屬性即可

navigate('/child1/child1B',{replace: true})

4. navigate(num) 路由跳轉(zhuǎn)糖耸,前進(jìn)、后退

// 歷史記錄 前進(jìn)
navigate(1)

// 歷史記錄 后退
navigate(-1)

// 歷史記錄 后退兩步
navigate(-2)

3. 嵌套路由

方式一:分離式
  1. 配置一級路由結(jié)構(gòu)
   在一級路由 App.js 中丘薛,擁有子路由的路由需要在 path 最后加上 /*
import React from "react";
import { Link, Route, Routes, Navigate } from "react-router-dom";
import Child1 from "./components/Child1";
import Child2 from "./components/Child2";
function App(props) {
  console.log(props);
  return (
    <div>
      <div>
        <Link to="/child1">Link: go to child1</Link> |{" "}
        <Link to="/child2">Link: go to child2</Link>
      </div>
      <div>
        {/* 定義路由出口 */}
        <Routes>
          {/* 根組件默認(rèn)展示 */}
          {/* <Route path="/" element={<Child1 />} /> */}
          {/* 路由重定向 */}
          <Route path="/" element={<Navigate to="/Child1" />} />

          <Route path="/child1/*" element={<Child1 />} />
          <Route path="/child2" element={<Child2 />} />
        </Routes>
      </div>
    </div>
  );
}

export default App;

  1. 配置子路由結(jié)構(gòu)
    在 Child1.js 中嘉竟,link 標(biāo)簽中要寫全路徑,路由出口的 path 中只寫路由名稱
import React, { Component } from "react";
import { Link, Route, Routes } from "react-router-dom";
import Child1A from "./Child1A";
import Child1B from "./Child1B";

export default class Child1 extends Component {
  render() {
    return (
      <div>
        <div>
          <Link to="/child1/child1A">Link: go to Child1A</Link> |{" "}
          <Link to="/child1/child1B">Link: go to Child1B</Link>
        </div>
        <div>
          {/* 定義路由出口 */}
          <Routes>
       
            {/* 路由重定向 */}
            {/* <Route path="/" element={<Navigate to="/Child1A" />} /> */}
            {/* 根組件默認(rèn)展示 */}
            <Route path="/" element={<Child1A />} />

            <Route path="child1A" element={<Child1A />} />
            <Route path="child1B" element={<Child1B />} />            
          </Routes>
        </div>
      </div>
    );
  }
}

方式二:集合式
  1. 配置嵌套路由結(jié)構(gòu)
    在 App.js 中洋侨,以 Route 組件嵌套的方式配置嵌套路由結(jié)構(gòu)
import React from "react";
import { Link, Route, Routes, Navigate } from "react-router-dom";
import Child1 from "./components/Child1";
import Child2 from "./components/Child2";
import Child1A from "./components/Child1A";
import Child1B from "./components/Child1B";
function App() {
  return (
    <div>
      <div>
        <Link to="/child1">Link: go to child1</Link> |{" "}
        <Link to="/child2">Link: go to child2</Link>
      </div>
      <div>
        {/* 定義路由出口 */}
        <Routes>
          <Route path="/" element={<Navigate to="/Child1/child1A" />} />
          <Route path="/child1" element={<Child1 />}>
            <Route path="child1A" element={<Child1A />} />
            <Route path="child1B" element={<Child1B />} />
          </Route>
          <Route path="/child2" element={<Child2 />} />
        </Routes>
      </div>
    </div>
  );
}

export default App;
  1. 定義子子路由出口
    在 Child1.js 中舍扰,引入 Outlet 并定義出口位置
import React, { Component } from "react";
import { Link, Outlet } from "react-router-dom";

export default class Child1 extends Component {
  render() {
    return (
      <div>
        <div>
          <Link to="/child1/child1A">Link: go to Child1A</Link> |{" "}
          <Link to="/child1/child1B">Link: go to Child1B</Link>
        </div>
        <div>
          {" "}
          <Outlet />
        </div>
      </div>
    );
  }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市凰兑,隨后出現(xiàn)的幾起案子妥粟,更是在濱河造成了極大的恐慌审丘,老刑警劉巖吏够,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異滩报,居然都是意外死亡锅知,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進(jìn)店門脓钾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來售睹,“玉大人,你說我怎么就攤上這事可训〔茫” “怎么了?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵握截,是天一觀的道長飞崖。 經(jīng)常有香客問我,道長谨胞,這世上最難降的妖魔是什么固歪? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮胯努,結(jié)果婚禮上牢裳,老公的妹妹穿的比我還像新娘逢防。我一直安慰自己,他們只是感情好蒲讯,可當(dāng)我...
    茶點故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布忘朝。 她就那樣靜靜地躺著,像睡著了一般伶椿。 火紅的嫁衣襯著肌膚如雪辜伟。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天脊另,我揣著相機與錄音导狡,去河邊找鬼。 笑死偎痛,一個胖子當(dāng)著我的面吹牛旱捧,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播踩麦,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼枚赡,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了谓谦?” 一聲冷哼從身側(cè)響起贫橙,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎反粥,沒想到半個月后卢肃,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡才顿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年莫湘,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片郑气。...
    茶點故事閱讀 38,716評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡幅垮,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出尾组,到底是詐尸還是另有隱情忙芒,我是刑警寧澤,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布讳侨,位于F島的核電站呵萨,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏爷耀。R本人自食惡果不足惜甘桑,卻給世界環(huán)境...
    茶點故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧跑杭,春花似錦铆帽、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至窄做,卻和暖如春愧驱,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背椭盏。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工组砚, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人掏颊。 一個月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓糟红,卻偏偏與公主長得像,于是被迫代替她去往敵國和親乌叶。 傳聞我的和親對象是個殘疾皇子盆偿,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,612評論 2 350

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