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>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容