当前位置: 首页 > article >正文

10_React router6

10_React router6

  • 前言:此处路由版本是 6.x ,[点击此处可以跳转 5.x版本](https://blog.csdn.net/qq_46143850/article/details/141962404)
  • 一、概述
    • 1、React Router 以三个不同的包发布到 npm 上,它们分别为:
    • 2、与 React Router 5.x 版本相比,改变了什么?
  • 二、Component
    • 1、BrowserRouter
      • 1.1 说明
      • 1.2 示例代码
    • 2、HashRouter
      • 2.1 说明:
      • 2.2 备注:
    • 3、``与`<Route>`
    • 4、Link
      • 4.1 作用:
      • 4.2 注意:
      • 4.3 示例代码:
    • 5、NavLink
      • 5.1 作用:
      • 5.2 示例代码:
    • 6、Navigate
      • 6.1 作用:
      • 6.2
      • 6.3 示例代码:
    • 7、Outlet
  • 三、Hooks
    • 1、useRoutes()
      • 1.1 作用:
      • 1.2 示例代码:
    • 2、useNavigate()
      • 2.1 作用:
      • 2.2 示例代码:
    • 3、useParams()
      • 3.1 作用:
      • 3.2 示例代码:
    • 4、useSearchParams()
      • 4.1 作用:
      • 4.2 返回一个包含两个值的数组,内容分别为:当前 search 参数,更新 search 的函数
      • 4.3 示例代码:
    • 5、useLocation()
      • 5.1 作用:
      • 5.2 示例代码:
    • 6、useMatch()
      • 6.1 作用:
      • 6.2 示例代码:
    • 7、useInRouterContext()
      • 7.1 作用:
      • 7.2 示例代码:
    • 8、useNavigationType()
      • 8.1 作用:
      • 8.2 示例代码:
    • 9、useOutlet()
      • 9.1 作用:
      • 9.2 示例代码:
    • 10、useResolvedPath()
      • 10.1 作用:
      • 10.2 示例代码:

前言:此处路由版本是 6.x ,点击此处可以跳转 5.x版本

一、概述

1、React Router 以三个不同的包发布到 npm 上,它们分别为:

1、react-router:路由的核心库,提供了很多的:组件、钩子
2、react-router-dom:包含 react-router 所有内容,并添加一些专门用于 DOM 的组件,例如 <BrowserRouter>
3、react-router-native: 包括 react-router 所有内容,并添加一些专门用于 ReactNative 的 API,例如 <NativeRouter>

2、与 React Router 5.x 版本相比,改变了什么?

1、内置组件的变化:移除 <Switch />,新增 <Routes/>
2、语法的变化: <component={About} /> 变成 element={<About/>}
3、新增多个 hook:useParamsuseNavigateuseMatch
4、官方明确推荐函数式组件了!!!

二、Component

1、BrowserRouter

1.1 说明

<BrowserRouter /> 用于包裹整个应用

1.2 示例代码

import React from 'react'
import ReactDOM from 'react-dom/client'
import { BrowserRouter } from 'react-router-dom'
import './index.css'
import App from './App'
const root = ReactDOM.createRoot(document.getElementById('root'))
root.render(
  <React.StrictMode>
    <BrowserRouter>
      <App />
    </BrowserRouter>
  </React.StrictMode>,
)

2、HashRouter

2.1 说明:

作用 与 <BrowserRouter /> 一样,但 <HashRouter />修改的是地址栏的 hash 值

2.2 备注:

6.x 版本中<BrowserRouter /><HashRouter />的用法跟 5.x 相同

3、<Routes/><Route>

1、V6 版本中移出了先前的 Switch ,引入了新的替代者:<Routes/>
2、<Routes/><Route> 要配合适用,且必须要用 <Routes/>包裹<Route>
3、<Route> 相当于一个 if 语句,如果其路径与当前 URL 匹配,则呈现其对应的组件。
4、<Route caseSensitive> 属性用于指定:匹配时是否区分大小写(默认为 false)。
5、当 URL 发生变化时,<Routes/>都会查看其所有子<Route>元素以找到最佳匹配并呈现组件。
6、<Route>也可以嵌套适用,且可配合 useRoutes()配置“路由表”,但需要通过<Outlet />组件来渲染其子路由, 详见代码【04_src_useRoutes 路由表】。

7、示例代码:

import './App.css'
import { NavLink, Routes, Route, Navigate } from 'react-router-dom'
import About from './pages/About'
import Home from './pages/Home'
/**
 * Navigate 取代了react-router 5.x的 Redirect
 */

function App() {
  return (
    <div className="padding20">
      <h1>React Router Demo</h1>
      <div className="row">
        <div className="sidebar">
          <NavLink className="list-item" to="/about">
            About
          </NavLink>
          <NavLink className="list-item" to="/home">
            Home
          </NavLink>
        </div>
        <div className="panel">
          <Routes>
            <Route path="/about" element={<About />} />
            <Route path="/home" element={<Home />} />
            <Route path="/" element={<Navigate to="/about" />} />
          </Routes>
        </div>
      </div>
    </div>
  )
}

export default App

4、Link

4.1 作用:

修改 URL,且不发送网络请求(路由链接)

4.2 注意:

外侧需要用 BrowserRouter 或 HashRouter 包裹

4.3 示例代码:

import { Link } from 'react-router-dom'
function Test() {
  return (
    <div>
      <link to="/路径">按钮</Link>
    </div>
  )
}

5、NavLink

5.1 作用:

与 Link 组件相似,且可实现导航的 “高亮”效果

5.2 示例代码:

// 注意:NavLink 默认类名式 active, 下面式指定自定义的 class
// 自定义样式
<NavLink
  className={({ isActive }) => {
    return isActive ? 'list-item active' : 'list-item'
  }}
  to="/home"
>
  Home
</NavLink>
/**
 * 默认情况下,当 Home 的子组件匹配成功,Home 的导航也会高亮
 * 当 NavLink 上添加了 end 属性后,若 Home 的子组件匹配成功,则 Home 的导航没有高亮效果
 */
<NavLink to="/home" end>
  Home
</NavLink>

6、Navigate

6.1 作用:

只要 <Navigate />组件被渲染,就会修改路径,切换视图

6.2

replace 属性用于控制跳转模式(push 或 replace,默认是 push。值默认是 false)

6.3 示例代码:

import React, { useState } from 'react'
import { Navigate } from 'react-router-dom'

export default function Home() {
  const [sum, setSum] = useState(0)
  return (
    <div>
      <h3> 我是 Home 组件</h3>
      {sum === 2 ? (
        <Navigate to="/about" replace={true} />
      ) : (
        <h4>当前 sum 的值是: {sum}</h4>
      )}
      <button
        onClick={() => {
          setSum(2)
        }}
      >
        点我将 sum 变成 2
      </button>
    </div>
  )
}

7、Outlet

1、当 Route 产生嵌套时,渲染其对应的后续子路由
2、示例代码看附件

三、Hooks

1、useRoutes()

1.1 作用:

根据路由表,动态创建 Routes 和 Route

1.2 示例代码:

// 路由表配置, src/router/index.js
import About from '../pages/About'
import Home from '../pages/Home'
import News from '../pages/News'
import Message from '../pages/Message'
import Detail from '../pages/Detail'
import { Navigate } from 'react-router-dom'
// eslint-disable-next-line import/no-anonymous-default-export
export default [
  {
    path: '/about',
    element: <About />,
  },
  {
    path: '/home',
    element: <Home />,
    children: [
      {
        path: 'news',
        element: <News />,
      },
      {
        path: 'message',
        element: <Message />,
        children: [
          {
            path: 'detail',
            element: <Detail />,
          },
        ],
      },
    ],
  },
  {
    path: '/',
    element: <Navigate to="/home" />,
  },
]
// App.jsx

import './App.css'
import { NavLink, useRoutes } from 'react-router-dom'
import routers from './router'
import Header from './components/Header'
function App() {
  const elements = useRoutes(routers)
  return (
    <div className="padding20">
      <Header />
      <div className="row">
        <div className="sidebar">
          <NavLink className="list-item" to="/about">
            About
          </NavLink>
          <NavLink className="list-item" to="/home">
            Home
          </NavLink>
        </div>
        <div className="panel">{elements}</div>
      </div>
    </div>
  )
}

export default App

2、useNavigate()

2.1 作用:

返回一个函数用来实现编程式导航

2.2 示例代码:

import React, { useState } from 'react'
import { Link, Outlet, useNavigate } from 'react-router-dom'

export default function Message() {
  const [message] = useState([
    { id: 1, title: '消息1', content: '举头望明月' },
    { id: 2, title: '消息2', content: '低头思故乡' },
  ])
  const navigate = useNavigate()

  function showDetail(item) {
    navigate('detail', {
      replace: true,
      state: {
        id: item.id,
        title: item.title,
        content: item.content,
      },
    })
  }
  return (
    <ul>
      {message.map((el) => {
        return (
          <li key={el.id}>
            {/* 路由链接 */}
            <Link
              to="detail"
              state={{
                id: el.id,
                title: el.title,
                content: el.content,
              }}
            >
              {el.title}
            </Link>

            <button
              onClick={() => {
                showDetail(el)
              }}
            >
              查看详情
            </button>
          </li>
        )
      })}
      {/* 路由展示区域 */}
      <Outlet />
    </ul>
  )
}

3、useParams()

3.1 作用:

回当前匹配路由的 param 参数,类似于 5.x 中的 match.params。

3.2 示例代码:

import React from 'react'
import { useParams, useMatch } from 'react-router-dom'

export default function Detail() {
  const { id, title, content } = useParams()
  // console.log(useMatch('/home/message/detail/:id/:title/:content'))

  return (
    <div>
      <p>id: {id}</p>
      <p>标题: {title}</p>
      <p>详细内容: {content}</p>
    </div>
  )
}

4、useSearchParams()

4.1 作用:

用于读取和修改当前位置的 URL 中的查询字符串

4.2 返回一个包含两个值的数组,内容分别为:当前 search 参数,更新 search 的函数

4.3 示例代码:

import React from 'react'
import { useSearchParams, useLocation } from 'react-router-dom'

export default function Detail() {
  console.log(useSearchParams())
  const [search, setSearch] = useSearchParams()
  console.log(search.get('id'), useLocation())
  return (
    <div>
      <button
        onClick={() => {
          setSearch('id=001&title=123&content=555')
        }}
      >
        点我更新一下收到的 search 参数
      </button>
      <p>id: {search.get('id')}</p>
      <p>标题: {search.get('title')}</p>
      <p>详细内容: {search.get('content')}</p>
    </div>
  )
}

5、useLocation()

5.1 作用:

获取当前 location 信息,对标 5.x 中的路由组件的 location 属性

5.2 示例代码:

import React from 'react'
import { useLocation } from 'react-router-dom'

export default function Detail() {
  const { state } = useLocation()
  console.log(state)
  return (
    <div>
      <p>id: {state.id}</p>
      <p>标题: {state.title}</p>
      <p>详细内容: {state.content}</p>
    </div>
  )
}

6、useMatch()

6.1 作用:

返回当前匹配信息,对标 5.x 中的路由组件的 match 属性

6.2 示例代码:

import React from 'react'
import { useMatch } from 'react-router-dom'

export default function Detail() {
  console.log(useMatch('/home/message/detail/:id/:title/:content'))
  /**
   * 
   {
    params:{x:"1", y:'10'},
    pathname:'/login/1/10',
    pattern: {
      path: '/login/:x/:y',
      CaseSensitive: false,
      end: false
    }
  }
   */
  return (
    <div>
      <p>id: {id}</p>
      <p>标题: {title}</p>
      <p>详细内容: {content}</p>
    </div>
  )
}

7、useInRouterContext()

7.1 作用:

判断是否用到路由

7.2 示例代码:

import './App.css'
import { NavLink, useRoutes, useInRouterContext } from 'react-router-dom'
import routers from './router'
import Header from './components/Header'
function App() {
  const elements = useRoutes(routers)
  console.log(useInRouterContext())
  return (
    <div className="padding20">
      <Header />
      <div className="row">
        <div className="sidebar">
          <NavLink className="list-item" to="/about">
            About
          </NavLink>
          <NavLink className="list-item" to="/home">
            Home
          </NavLink>
        </div>
        <div className="panel">{elements}</div>
      </div>
    </div>
  )
}

export default App

8、useNavigationType()

8.1 作用:

判断路由的类型, POP PUSH REPLACE
POP 是刷新当前页面会出现

8.2 示例代码:

import React from 'react'
import { useNavigationType } from 'react-router-dom'
export default function News() {
  console.log(useNavigationType())
  return (
    <ul>
      <li>11</li>
      <li>11</li>
      <li>11</li>
      <li>11</li>
    </ul>
  )
}

9、useOutlet()

9.1 作用:

用来呈现当前组件中要渲染的嵌套路由

9.2 示例代码:

import React from 'react'
import { NavLink, Outlet, useOutlet } from 'react-router-dom'

export default function Home() {
  console.log(useOutlet())
  return (
    <>
      <h3> 我是 Home 组件</h3>
      <div className="sidebar2">
        <NavLink className="list-item" to="news">
          news
        </NavLink>
        <NavLink className="list-item" to="message">
          Message
        </NavLink>
      </div>
      {/* 指定路由组件呈现的位置 */}
      <Outlet />
    </>
  )
}

10、useResolvedPath()

10.1 作用:

给定一个 URL 值,解析其中的 path、search、hash 值
可以输入任意路径地址,不是当前系统的也可以

10.2 示例代码:

import React from 'react'
import { useResolvedPath } from 'react-router-dom'
export default function News() {
  console.log('@@', useResolvedPath('xxx.com?id=12&title=888'))
  return (
    <ul>
      <li>11</li>
      <li>11</li>
      <li>11</li>
      <li>11</li>
    </ul>
  )
}

http://www.kler.cn/news/324460.html

相关文章:

  • React Native 在 build iOS 的时候如果出现关于 `metro` 的错误
  • My_string 运算符重载,My_stack
  • JavaScript 中的闭包的形成及使用场景
  • 代码随想录_刷题笔记_第三次
  • MySQL 高级 - 第十五章 | MySQL 事务日志
  • 完全二叉树的递归创建思路及代码
  • 1Panel安装部署证书(httpsok.com)
  • matlab入门学习(二)矩阵、字符串、基本语句、函数
  • UART驱动学习一(UART硬件介绍)
  • 泛微E8JDK1.6判断时间在早上8点半到晚上六点半之间的值
  • WPF入门教学二十四 WPF性能优化
  • 机器学习与深度学习的技术比较
  • Docker网络、数据卷及安全优化
  • C++学习笔记(39)
  • C#中的报文(Message)
  • 9月29日微语报,星期日,农历八月廿七
  • C++--IO流
  • Eureka原理实践:构建高可用、可扩展的微服务架构
  • .NET 红队武器库和资源集合 (第38期)
  • Scrapy框架入门
  • Django 常用注解
  • python的pyinstaller
  • InnoDB索引结构
  • 【分布式微服务云原生】8分钟掌握微服务通信的艺术:Dubbo与OpenFeign全面解析
  • MacOS上安装MiniConda的详细步骤
  • SVG 滤镜:探索图形设计的无限可能
  • 低代码可视化-UniApp二维码可视化-代码生成器
  • C#测试调用FreeSpire.PDFViewer浏览PDF文件
  • 浅谈C++之Redis缓存
  • 遥感图像变换检测实践上手(TensorRT+UNet)