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组件 作为 路由占位符路由规则

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

(1)Router组件
① 包裹整个应用,一个React应用 只需要使用一次
② 两种常用的Router: HashRouter和BrowserRouter
③ HashRouter: 使用URL的哈希值实现 (localhost:3000/#/first)
④ BrowserRouter:使用H5的history API实现(localhost:3000/first) 推荐

(2)Link组件
① 就是声明式导航的路由链接(a标签)
② to属性的值就是 pathName, 可以通过location.pathName获取。

(3)Route组件
① 路由占位符和路由规则的结合
② 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.路由占位符和路由规则 */}
          <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( 数字 )

  • useNavigate 的三种传参方式:search、params、state参数。
    (1)search参数的传递与接收: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参数的传递与接收:useNavigate + useParams
(3)state参数的传递与接收: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开始变为精准匹配)

只要 pathname 以 path开头 就会匹配成功。( pathName:Link组件的to属性值;path:Route组件的path属性值。)

模糊匹配模式.png

(2)给Route组件添加 exact属性,让其变为精准匹配模式

只有当 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属性:一个 函数props,用于直接渲染 重定向组件
(2)<Redirect>重定向组件:to属性 指定重定向的路径。
(3)精准比配:只有当页面中的路径 全等于 / 时,才会跳至重定向的页面路径。

7.路由懒加载

(1)在路由的声明页面(比如App.js)引入 lazy组件、Suspense组件

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

(2)引入组件时,用lazy函数的方式。(等待时展示的组件直接引入。)

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之后,不会再继续匹配。

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:用来实现vue的keep alive的缓存功能。

import CacheRoute, { CacheSwitch } from "react-router-cache-route";
<CacheSwitch>
  <CacheRoute
    path="/index/structureSubjectType"
    component={SubjectType}
    key="structureSubjectType"
    when="always"
  />
</CacheSwitch>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,125评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,293评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,054评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,077评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,096评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,062评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,988评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,817评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,266评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,486评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,646评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,375评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,974评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,621评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,642评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,538评论 2 352

推荐阅读更多精彩内容