2022-04-20 React 第四天

一窄绒、React路由的基本使用

react項目一般在App.js中配置路由孽椰。

1.使用步驟

(1)安裝 react-router-dom

yarn add react-router-dom

(2)導入路由的三個核心組件: BrowserRouter 委粉、Route 茎辐、 Link (新增Routes)

import {BrowserRouter as Router, Route, Link} from 'react-router-dom'

(3)使用 Router(BrowserRouter) 組件包裹 整個應用
(4)使用 Link組件 作為 路由鏈接

<Link to="/myrouter">路由鏈接</Link>

(5)使用 Route組件 作為 路由占位符路由規(guī)則

<Routes>
  <Route path="/myrouter" component={MyRouter}></Route>
</Routes>
2.常用組件說明

(1)Router組件
① 包裹整個應用叫挟,一個React應用 只需要使用一次旁趟。
② 兩種常用的Router: HashRouter和BrowserRouter
③ HashRouter: 使用URL的哈希值實現(xiàn) (localhost:3000/#/first)
④ BrowserRouter:使用H5的history API實現(xiàn)(localhost:3000/first) 推薦

(2)Link組件
① 就是聲明式導航的路由鏈接(a標簽)
② to屬性的值就是 pathName昼激, 可以通過location.pathName獲取庇绽。

(3)Route組件
① 路由占位符和路由規(guī)則的結合
② path屬性:路由的路徑
③ element屬性:展示的組件

注意:
① 新版本中,必須用 <Routes>組件 包裹<Route>組件橙困;
element 屬性替代了component屬性瞧掺,并且必須用 jsx 的語法指定組件。

import React from 'react';
import ReactDOM from 'react-dom';
// 1.導入路由所需的包
import { BrowserRouter as Router, Route, Link, Routes } from 'react-router-dom';

// 5.路由組件
const MyRouter = () => <h1>我是路由組件</h1>

class MyApp extends React.Component {
  render () {
    return (
      // 2.用Router組件包裹應用
      <Router>
        <div>
          {/*3. 路由鏈接 */}
          <Link to="/myrouter">路由鏈接</Link>

          {/* 4.路由占位符和路由規(guī)則 */}
          <Routes>
            <Route path="/myrouter" element={<MyRouter />}></Route> // 【注意】:這里是新版本寫法凡傅,用的element屬性
          </Routes>
        </div>
      </Router>
    )
  }
}
ReactDOM.render(<MyApp></MyApp>, document.getElementById('root'))
3.編程式導航

this.props.history.push( /路徑 )
this.props.history.go( 數(shù)字 )

  • useNavigate 的三種傳參方式:search辟狈、params、state參數(shù)夏跷。
    (1)search參數(shù)的傳遞與接收:useNavigate + useSearchParams
import { useNavigate } from 'react-router-dom';

cosnt List = (props)=>{
  const navigate = useNavigate();

  const handleClick=()=> {
    navigate('/listDetail?id=100&name=馬冬梅', {
       state: {
         id: 1,
         name: '馬冬梅',
       }
     });
   }
 }
import { useSearchParams} from 'react-router-dom'

const [searchParams,setSearchParams] = useSearchParams()
console.log(searchParams.get('id')); // 100

(2)params參數(shù)的傳遞與接收:useNavigate + useParams
(3)state參數(shù)的傳遞與接收:useNavigate + useLocation

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

cosnt List = (props)=>{
  const navigate = useNavigate();

  const handleClick=()=> {
    navigate('/listDetail', {
       state: {
         id: 1,
         name: '馬冬梅',
       }
     });
   }
 }
import { useLocation} from 'react-router-dom'

const stateParams= useLocation().state  // stateParams:{id:1, name:'馬冬梅'}

4.匹配模式

(1)React路由默認為 模糊匹配模式(v6開始變?yōu)榫珳势ヅ洌?/p>

只要 pathname 以 path開頭 就會匹配成功哼转。( pathName:Link組件的to屬性值;path:Route組件的path屬性值槽华。)

模糊匹配模式.png

(2)給Route組件添加 exact屬性壹蔓,讓其變?yōu)?strong>精準匹配模式

只有當 path和pathname完全匹配 時才會展示改路由

5.嵌套路由

1.一般將home、login等一級路由猫态,寫在App.js中佣蓉。
2.嵌套的二級路由,寫在 home父組件 中亲雪。
3.路由路徑
(1)v5及之前版本:父級路由路徑正常寫 '/home'勇凭;子級路由路徑,必須 以父路徑開頭 '/home/child'义辕。
(2)v6及之后版本:父級路由路徑必須是 '/*' 虾标;子級路由路徑正常寫 '/child'。

6. 路由重定向

<Route path='/' exact render={() => <Redirect to='/home'></Redirect>}></Route>

(1)Route組件的render屬性:一個 函數(shù)props终息,用于直接渲染 重定向組件夺巩。
(2)<Redirect>重定向組件:to屬性 指定重定向的路徑。
(3)精準比配:只有當頁面中的路徑 全等于 / 時周崭,才會跳至重定向的頁面路徑柳譬。

7.路由懶加載

(1)在路由的聲明頁面(比如App.js)引入 lazy組件、Suspense組件续镇。

import React,{ lazy, Suspense } from 'react'

(2)引入組件時美澳,用lazy函數(shù)的方式。(等待時展示的組件直接引入摸航。)

const Home = lazy(()=> import('./home'))
import Loading from './loading'

(3)路由組件<Route></Route>必須用 <Suspense></Suspense>包裹制跟,并用fallback屬性 指定等待時展示的組件。

<Suspense fallback={Loading}>
  <Route path="./home" component={Home}></Route>
</Suspense>

8.其他路由組件

(1)Switch: 將Route組件包裹在Switch組件之中酱虎,當path匹配到一個component之后雨膨,不會再繼續(xù)匹配。

import { BrowserRouter as Router, Route, Switch, } from "react-router-dom";
<Router>
  <Switch>
    <Route path="/" exact component={Home} remark="默認界面"/>
    <Route path="/login" component={Login} remark="登錄界面" />
  </Switch>
</Router>

(2)CacheSwitchCacheRoute:用來實現(xiàn)vue的keep alive的緩存功能读串。

import CacheRoute, { CacheSwitch } from "react-router-cache-route";
<CacheSwitch>
  <CacheRoute
    path="/index/structureSubjectType"
    component={SubjectType}
    key="structureSubjectType"
    when="always"
  />
</CacheSwitch>
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末聊记,一起剝皮案震驚了整個濱河市撒妈,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌排监,老刑警劉巖狰右,帶你破解...
    沈念sama閱讀 221,273評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異舆床,居然都是意外死亡棋蚌,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評論 3 398
  • 文/潘曉璐 我一進店門挨队,熙熙樓的掌柜王于貴愁眉苦臉地迎上來谷暮,“玉大人,你說我怎么就攤上這事瞒瘸】辣福” “怎么了?”我有些...
    開封第一講書人閱讀 167,709評論 0 360
  • 文/不壞的土叔 我叫張陵情臭,是天一觀的道長。 經(jīng)常有香客問我赌蔑,道長俯在,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,520評論 1 296
  • 正文 為了忘掉前任娃惯,我火速辦了婚禮跷乐,結果婚禮上,老公的妹妹穿的比我還像新娘趾浅。我一直安慰自己愕提,他們只是感情好,可當我...
    茶點故事閱讀 68,515評論 6 397
  • 文/花漫 我一把揭開白布皿哨。 她就那樣靜靜地躺著浅侨,像睡著了一般。 火紅的嫁衣襯著肌膚如雪证膨。 梳的紋絲不亂的頭發(fā)上如输,一...
    開封第一講書人閱讀 52,158評論 1 308
  • 那天,我揣著相機與錄音央勒,去河邊找鬼不见。 笑死,一個胖子當著我的面吹牛崔步,可吹牛的內(nèi)容都是我干的稳吮。 我是一名探鬼主播,決...
    沈念sama閱讀 40,755評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼井濒,長吁一口氣:“原來是場噩夢啊……” “哼灶似!你這毒婦竟也來了列林?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,660評論 0 276
  • 序言:老撾萬榮一對情侶失蹤喻奥,失蹤者是張志新(化名)和其女友劉穎席纽,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體撞蚕,經(jīng)...
    沈念sama閱讀 46,203評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡润梯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,287評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了甥厦。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片纺铭。...
    茶點故事閱讀 40,427評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖刀疙,靈堂內(nèi)的尸體忽然破棺而出舶赔,到底是詐尸還是另有隱情,我是刑警寧澤谦秧,帶...
    沈念sama閱讀 36,122評論 5 349
  • 正文 年R本政府宣布竟纳,位于F島的核電站,受9級特大地震影響疚鲤,放射性物質(zhì)發(fā)生泄漏锥累。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,801評論 3 333
  • 文/蒙蒙 一集歇、第九天 我趴在偏房一處隱蔽的房頂上張望桶略。 院中可真熱鬧,春花似錦诲宇、人聲如沸际歼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鹅心。三九已至,卻和暖如春它掂,著一層夾襖步出監(jiān)牢的瞬間巴帮,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工虐秋, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留榕茧,地道東北人。 一個月前我還...
    沈念sama閱讀 48,808評論 3 376
  • 正文 我出身青樓客给,卻偏偏與公主長得像用押,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子靶剑,可洞房花燭夜當晚...
    茶點故事閱讀 45,440評論 2 359

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