1001router6-react

news2024/9/20 10:42:38

文章目录

    • 1 一级路由
    • 2 Navigate
    • 3 NavLink 自定义高亮样式
    • 4 useRoutes()
    • 5 嵌套路由
    • 6 路由传参
      • 6.1 传递params参数
      • 6.2 传递search参数
      • 6.3 传递state参数
    • 7 编程式导航
      • 7.1 路由跳转
      • 7.2 前进、后退
    • 8 钩子函数
      • 8.1 useInRouterContext()
      • 8.2 useNavigationType()
      • 8.3 useOutlet()
      • 8.4 useResolvedPath()
    • 9 小结
      • 1. `<BrowserRouter>`
      • 2. `<HashRouter>`
      • 3. ` 与 `
      • 4. `<Link>`
      • 5. `<NavLink>`
      • 6. `<Navigate>`
      • 7. `<Outlet>`
    • 3.Hooks
      • 1. useRoutes()
      • 2. useNavigate()
      • 3. useParams()
      • 4. useSearchParams()
      • 5. useLocation()
      • 6. useMatch()
      • 7. useInRouterContext()
      • 8. useNavigationType()
      • 9. useOutlet()
      • 10.useResolvedPath()
    • 结语

1 一级路由

以之前讲解react-router-dom 5版本为例,做为基础使用:

第一步:安装react-router-dom@6.x版本

yarn add react-router-dom 

第二步:<BrowserRouter></Browser>包裹App

第三步:路由链接与注册路由,App.jsx源代码如下所示

import React, { Component } from 'react'
import { NavLink, Route, Routes } from "react-router-dom";

import About from './page/About';
import Home from './page/Home';

export default class App extends Component {
  render() {
    return (
      <div>
        <div className="row">
          <div className="col-xs-offset-2 col-xs-8">
            <div className="page-header"><h2>React Router Demo</h2></div>
          </div>
        </div>
        <div className="row">
          <div className="col-xs-2 col-xs-offset-2">
            <div className="list-group">
              <NavLink className='list-group-item' to="/about">About</NavLink>
              <NavLink className='list-group-item' to="/home">Home</NavLink>
            </div>
          </div>
          <div className="col-xs-6">
            <div className="panel">
              <div className="panel-body">
                {/* 注册路由 */}
                <Routes>
                  <Route path="/about" element={<About />} />
                  <Route path="/home" element={<Home />} />
                </Routes>
              </div>
            </div>
          </div>
        </div>
      </div>
    )
  }
}
  • 注册路由组件必须Routes包裹,当匹配路径匹配某个路由的时候,不在继续向下匹配。

2 Navigate

router6 重定向使用Navigate,语法如下所示:

<Route path='/' element={<Navigate to="/about" replace={true}/>}></Route>
  • 相当于兜底匹配,当不匹配上述所有的路由时,匹配该路由渲染to指向的路径对应的路由组件;
  • to属性必须指定,表示要切换的路径;replace表示跳转模式,默认false即push模式;
  • Navigate被渲染会引起视图切换。

3 NavLink 自定义高亮样式

router6中 className通过函数返回自定义样式

  function computedClassName({isActive}) {
    return isActive ? 'list-group-item g2zh' : 'list-group-item';
  }
<NavLink className={computedClassName} to="/about">About</NavLink>
  • 函数参数默认传递{isActive: 布尔值},只有当前路由链接对应的值为true.

4 useRoutes()

router6我们通过配置路由表,根据路由表通过useRoutes生成路由规则。

第一步:配置路由表,routes/index.js源代码如下所示:

import { Navigate } from "react-router-dom";

import About from '../page/About';
import Home from '../page/Home';

 const routes = [
  {
    path: '/about', 
    element: <About /> 
  },
  {
    path: '/home',
    element: <Home />
  },
  {
    path: '/',
    element: <Navigate to="/about" />
  }
]

export default routes;

第二步:useRoutes()使用生成路由规则,App.jsx代码如下

import React from 'react'
import { NavLink, useRoutes } from "react-router-dom";

import routes from './routes';

export default function App() {

  // 根据路由表生成对应的路由规则
  const element = useRoutes(routes);

// ...省略

              {/* 注册路由 */}
              { element }
// 省略
}

如下图所示:在这里插入图片描述

5 嵌套路由

第一步:在路由配置表中通过children,配置子路由

import { Navigate } from "react-router-dom";

import About from '../page/About';
import Home from '../page/Home';
import Message from '../page/Home/Message';
import News from '../page/Home/News';


 const routes = [
  {
    path: '/about', 
    element: <About /> 
  },
  {
    path: '/home',
    element: <Home />,
    children: [
      {
        path: 'message',
        element: <Message />
      },
      {
        path: 'news',
        element: <News />
      }
    ]
  },
  {
    path: '/',
    element: <Navigate to="/about" />
  }
]

export default routes;

第二步:<Outlet/>在需要展示子路由组件地方,Home/index.jsx代码如下

import React from 'react'
import { NavLink, Outlet } from 'react-router-dom';
export default function Home() {

  return (
    <div>
      <h3>我是Home的内容</h3>
      <div>
        <ul className="nav nav-tabs">
          <li>
            <NavLink className="list-group-item" to="news">News</NavLink>
          </li>
          <li>
            <NavLink className="list-group-item" to="message">Message</NavLink>
          </li>
        </ul>
      </div>
      {/* 指定路由组件呈现的位置 */}
      <Outlet />
    </div>
  )
}
  • NavLink属性to可以只指定当前路径;
  • 如果不需要父组件高亮,在父路由链接NavLink 中添加属性end。

效果如下图所示:

在这里插入图片描述

6 路由传参

6.1 传递params参数

第一步:Meseage/index.jsx路由嵌套,传递参数改写

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

export default function Message() {
  const [messages, setMessages] = useState([
    { id: 1, title: '消息1', content: '锄禾日当午'},
    { id: 2, title: '消息2', content: '汗滴禾下土'},
    { id: 3, title: '消息3',content: '谁知盘中餐' },
    { id: 4, title: '消息4', content: '粒粒皆辛苦' }
  ])
  return (
    <div>
      <ul>
        {
          messages.map((msg) => {
            return (
              <li key={msg.id}>
                <Link to={`detail/${msg.id}/${msg.title}/${msg.content}`}>{msg.title}</Link>&nbsp;&nbsp;
              </li>
            )
          })
        }
      </ul>
      <hr />
      <Outlet />
    </div>
  )
}

第二步:配置路由routes/index.js改写如下:

// 省略...
{
    path: 'message',
    element: <Message />,
    children: [
      {
        path: 'detail/:id/:title/:content',
        element: <Detail />
      }]
  },
// 省略...

第三部 Home/Message/Detail/index.jsx接受参数

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

export default function Detail() {


  const { id, title, content } = useParams();  
  // const { id, title, content } = useMatch('/home/message/detail/:id/:title/:content').params;  
  return (
    <ul>
      {/* <li>ID: xxx</li>
        <li>TITLE: xxx</li>
        <li>CONTENT: xxx</li> */}
      <li>ID: {id}</li>
      <li>TITLE: {title}</li>
      <li>CONTENT: {content}</li>
    </ul>
  )
}

6.2 传递search参数

第一步:Meseage/index.jsx路由嵌套,传递参数改写

// 省略...
  return (
    <div>
      <ul>
        {
          messages.map((msg) => {
            return (
              <li key={msg.id}>
                <Link to={`detail/${msg.id}/${msg.title}/${msg.content}`}>{msg.title}</Link>&nbsp;&nbsp;
              </li>
            )
          })
        }
      </ul>
      <hr />
      <Outlet />
    </div>
  )
}

第二步:配置路由routes/index.js改写如下:

// 省略...
{
    path: 'message',
    element: <Message />,
    children: [
      {
       path: 'detail',
        element: <Detail />
      }]
  },
// 省略...

第三部 Home/Message/Detail/index.jsx接受参数

import React from 'react'
import { useSearchParams } from "react-router-dom";

export default function Detail() {
  const [searchParams, setSearchParams] = useSearchParams();
  const id = searchParams.get('id');
  const title = searchParams.get('title');
  const content = searchParams.get('content'); 
  return (
    <ul>
      {/* <li>ID: xxx</li>
        <li>TITLE: xxx</li>
        <li>CONTENT: xxx</li> */}
      <li>ID: {id}</li>
      <li>TITLE: {title}</li>
      <li>CONTENT: {content}</li>
    </ul>
  )
}

  • useSearchParams()用法类似useState()

6.3 传递state参数

第一步:Meseage/index.jsx路由嵌套,传递参数改写

// 省略...
  return (
    <div>
      <ul>
        {
          messages.map((msg) => {
            return (
              <li key={msg.id}>
                <Link to="detail" state={{id: msg.id, title: msg.title, content: msg.content}}>{msg.title}</Link>&nbsp;&nbsp;
              </li>
            )
          })
        }
      </ul>
      <hr />
      <Outlet />
    </div>
  )
}

第二步:配置路由routes/index.js改写如下:

// 省略...
{
    path: 'message',
    element: <Message />,
    children: [
      {
       path: 'detail',
        element: <Detail />
      }]
  },
// 省略...

第三部 Home/Message/Detail/index.jsx接受参数

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

export default function Detail() {
  const {state: {id, title, content}} = useLocation()
// ...省略

7 编程式导航

7.1 路由跳转

第一步:添加按钮事件

<button onClick={() => showDetail(msg)}>查看详情</button>

第二步:引入useNavigate钩子函数,实现带参跳转

import { Link, Outlet, useNavigate } from 'react-router-dom'
const navigate = useNavigate()
  
  // 查看详情
  function showDetail(msg) {
    // console.log('查看这消息的跟路吧');
    navigate('detail', {
      state: {
        id: msg.id,
        title: msg.title,
        content: msg.content
      } 
    })
  }

7.2 前进、后退

在普通组件components/Header/index.jsx代码如下

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

export default function Header() {

 const navigate =  useNavigate();

 /**
  * 前进
  */
 function forward (){
  navigate(1)
 }

 /**
  * 后退
  */
 function back () {
  navigate(-1)
 }

  return (
    <div className="col-xs-offset-2 col-xs-8">
      <div className="page-header"><h2>React Router Demo</h2></div>
      <button onClick={forward}>前进</button>
      <button onClick={back}>后退</button>
    </div>
  )
}

8 钩子函数

8.1 useInRouterContext()

如果组件被选择在路由上下文中,直观理解就是被包裹在<Router>中,返回true;否则返回false

示例在App.jsx中:

import { useInRouterContext } from "react-router-dom";
console.log('---', useInRouterContext());
// 输出
--- true

8.2 useNavigationType()

  • 左右返回当前路由导航的类型(用户如何来到当前页面的)。
  • 返回值:POP、PUSH、REPLACE。
  • 备注:POP指在浏览器中直接打开这个路由组件(刷新页面)。

示例News/index.jsx

import { useNavigationType } from "react-router-dom";
console.log('===', useNavigationType());
// 输出默认PUSH
=== PUSH
// 路由链接加上 replace 
=== REPLACE
// 直接刷新页面
=== POP

8.3 useOutlet()

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

  • 示例Home/index.jsx:

    // 从根路径开始,点击Home导航
    @@ null
    // 点击子路由
    @@ {$$typeof: Symbol(react.element), type: {…}, key: null, ref: null, props: {…}, …}
    
    • 如果嵌套路由没有挂载,则为null;如果嵌套路由已挂载,则展示嵌套的路由对象。

8.4 useResolvedPath()

  • 作用:给定一个URL值,解析其中的:path、search、hash值。

  • 示例:

    import { useResolvedPath } from "react-router-dom";
    console.log('@@@', useResolvedPath('/news?id=1&title=abc#xxx'));
    // 输出
    {pathname: '/news', search: '?id=1&title=abc', hash: '#xxx'}
    

9 小结

1. <BrowserRouter>

  1. 说明:<BrowserRouter> 用于包裹整个应用。

2. <HashRouter>

  1. 说明:作用与<BrowserRouter>一样,但<HashRouter>修改的是地址栏的hash值。
  2. 备注:6.x版本中<HashRouter><BrowserRouter> 的用法与 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> 组件来渲染其子路由。

4. <Link>

  1. 作用: 修改URL,且不发送网络请求(路由链接)。

  2. 注意: 外侧需要用<BrowserRouter><HashRouter>包裹。

5. <NavLink>

  1. 作用: 与<Link>组件类似,且可实现导航的“高亮”效果。

6. <Navigate>

  1. 作用:只要<Navigate>组件被渲染,就会修改路径,切换视图。

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

7. <Outlet>

  1. <Route>产生嵌套时,渲染其对应的后续子路由。

3.Hooks

1. useRoutes()

  1. 作用:根据路由表,动态创建<Routes><Route>

2. useNavigate()

  1. 作用:返回一个函数用来实现编程式导航。

3. useParams()

  1. 作用:回当前匹配路由的params参数,类似于5.x中的match.params

4. useSearchParams()

  1. 作用:用于读取和修改当前位置的 URL 中的查询字符串。
  2. 返回一个包含两个值的数组,内容分别为:当前的seaech参数、更新search的函数。

5. useLocation()

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

6. useMatch()

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

7. useInRouterContext()

		作用:如果组件在 `<Router>` 的上下文中呈现,则 `useInRouterContext` 钩子返回 true,否则返回 false。

8. useNavigationType()

  1. 作用:返回当前的导航类型(用户是如何来到当前页面的)。
  2. 返回值:POPPUSHREPLACE
  3. 备注:POP是指在浏览器中直接打开了这个路由组件(刷新页面)。

9. useOutlet()

  1. 作用:用来呈现当前组件中渲染的嵌套路由。

10.useResolvedPath()

  1. 作用:给定一个 URL值,解析其中的:path、search、hash值。

结语

❓QQ:806797785

⭐️源代码仓库地址:https://github.com/gaogzhen/react-staging.git

参考:

[1]React视频教程[CP/OL].2020-12-15.p127-141.

[2]React官网[CP/OL].

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/660219.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

手写Spring框架---AOP实现

目录 容器是OOP的高级工具 系统需求 关注点分离Concern Separation 原有实现 AOP的成员 Advice的种类 单个Aspect的执行顺序 多个Aspect的执行顺序 Introduction-引入型Advice 代理模式 JDK动态代理 Spring AOP的实现原理之JDK动态代理 Spring AOP的实现原理之CGL…

CSS基础学习--19 下拉菜单

一、基本下拉菜单 当鼠标移动到指定元素上时&#xff0c;会出现下拉菜单 <!DOCTYPE html> <html> <head> <title>下拉菜单实例</title> <meta charset"utf-8"> <style> .dropdown {position: relative;display: inline-…

UnityVR-项目的管理阶层

目录 概述 项目的总体架构 单例基类 继承MonoBehaviour的单例基类 概述 一个具备一定规模的项目&#xff0c;一般都需要由不同人员合作完成&#xff0c;每个人的想法风格不相同&#xff0c;如果一开始没有定下基本的框架&#xff0c;会让实现时混乱不堪&#xff0c;而且无法…

【CesiumJS入门】(5)GooJSON的加载、更新、监听与销毁——GeoJsonDataSource应用

前言 本篇&#xff0c;我们将较完整得介绍Cesium中GeoJSON/TopoJSON相关的方法。 GeoJSON规范地址&#xff1a;RFC 7946: The GeoJSON Format (rfc-editor.org) GeoJSON在线绘制&#xff1a;geojson.io CesiumJS提供了一个名为DataSource的类&#xff0c;它主要是用来加载和展…

Java-API简析_java.util.UUID类(基于 Latest JDK)(浅析源码)

【版权声明】未经博主同意&#xff0c;谢绝转载&#xff01;&#xff08;请尊重原创&#xff0c;博主保留追究权&#xff09; https://blog.csdn.net/m0_69908381/article/details/131270140 出自【进步*于辰的博客】 其实我的【Java-API】专栏内的博文对大家来说意义是不大的。…

《计算之魂》读书笔记——递归与堆栈的关系

进入梅雨季节&#xff0c;一周末雨水连绵不绝&#xff0c;空气中泛着潮湿的凉爽。这个天气最适合找个角落&#xff0c;安安静静地读书写字。 继续读《计算之魂》&#xff0c;前次读到递归&#xff0c;今天则了解递归地数据结构实现。递归算法的层层实现&#xff0c;需要保留从…

大数据周会-本周学习内容总结018

开会时间&#xff1a;2023.06.18 15:00 线下会议 01【调研-数据分析&#xff08;质量、ETL、可视化&#xff09;】 ETL&#xff0c;是英文Extract-Transform-Load的缩写&#xff0c;用来描述将数据从来源端经过抽取&#xff08;extract&#xff09;、转换&#xff08;transform…

Tcl常用命令备忘录-正则命令篇

正则表达式是一种用于匹配、查找、替换文本中特定模式的工具。在Tcl脚本中&#xff0c;可以使用正则表达式对字符串进行匹配、查找和替换。 regexp 语法&#xff1a; regexp ?选项? 正则表达式 字符串 ?变量1 变量2 ...? 其中&#xff0c;?选项?为可选项&#xff0c;…

基于蒙特卡洛法的规模化电动汽车充电负荷预测(PythonMatlab实现)

目录 0 概述 1 蒙特卡洛模拟方法介绍 2 规模化电动汽车充电负荷预测计算方法 3 完整代码 0 概述 对于本文的研究,依据不同用途电动汽车影响因素的分布函数和设定参数&#xff0c;采用蒙特卡洛法,对各用途电动汽车的日行驶里程、起始充电时间概率分布参数进行随机抽样&#xff0…

linuxOPS系统服务_Linux下软件的安装方式之源码安装

Linux下有哪些软件安装方式 ① RPM软件包管理&#xff08;软件名称.rpm&#xff09; ② YUM软件包管理&#xff08;使用yum命令install 软件名称&#xff09; > 下载 安装一体化 ③ 源码编译安装&#xff08;相对来说是最复杂的一种方式&#xff09; 软件包类型 ☆ 二…

十二、docker学习-docker核心docker网络之bridge网络(2)

bridge网络 bridge网络表现形式就是docker0这个网络接口。容器默认都是通过docker0这个接口进行通信。也可以通过docker0去和本机的以太网接口连接&#xff0c;这样容器内部才能访问互联网。 # 查看docker0网络&#xff0c;在默认环境中&#xff0c;一个名为docker0的linux b…

Go语言的TCP和HTTP网络服务基础

目录 【TCP Socket 编程模型】 Socket读操作 【HTTP网络服务】 HTTP客户端 HTTP服务端 TCP/IP 网络模型实现了两种传输层协议&#xff1a;TCP 和 UDP&#xff0c;其中TCP 是面向连接的流协议&#xff0c;为通信的两端提供稳定可靠的数据传输服务&#xff1b;UDP 提供了一种…

NodeJSMongodbMVC管理开发⑨

文章目录 ✨文章有误请指正&#xff0c;如果觉得对你有用&#xff0c;请点三连一波&#xff0c;蟹蟹支持&#x1f618;前言MVC思想开发 服务器代码演示 M层 Services 或 Model V层 Views C层 Controllers总结 ✨文章有误请指正&#xff0c;如果觉得对你有用&#xff0c…

C语言笔记之结构体总结

C语言笔记之结构体总结 code review! 文章目录 C语言笔记之结构体总结一.介绍二.3种结构体类型变量说明1. 先定义结构&#xff0c;再定义结构变量2. 定义结构体类型的同时说明变量3. 直接说明结构变量(匿名结构体) 四.结构体成员表示方法五.结构体指针做参数六.结构体初始化1…

阵列信号处理笔记(2):均匀线阵、均匀加权线阵、波束方向图

阵列信号处理笔记&#xff08;2&#xff09; 文章目录 阵列信号处理笔记&#xff08;2&#xff09;均匀线阵&#xff08;Uniform Linear Array&#xff09;均匀加权线阵波束方向图的关键参数附polardb.m用来计算HPBW的Mathematica代码&#xff0c;以及用于拟合的数据拟合的MATL…

二、DSMP/OLS等夜间灯光数据贫困地区识别——MPI和灯光指数计算

一、前言 其实在计算MPI和灯光指数之前,最重要是DMSP/OLS等夜间灯光指数的校正还有就是MPI计算,那么校正分为DMSP/OLS和NPP/VIIRS夜间灯光数据,DMSP/OLS夜间灯光数据校正主要采取不变目标区域法原理进行校正,当前对其有很多优化后的做法,但是万变不离其宗,核心思想还是没…

LeetCode257. 二叉树的所有路径

写在前面&#xff1a; 题目链接&#xff1a;LeetCode257. 二叉树的所有路径 题目难度&#xff1a;简单 编程语言&#xff1a;C 一、题目描述 给你一个二叉树的根节点 root &#xff0c;按 任意顺序 &#xff0c;返回所有从根节点到叶子节点的路径。 叶子节点 是指没有子节点的…

阿里P8架构师手码的Java工程师面试小抄在Github火了,完整版限时开源

网上的 JAVA 面试文档更是层出不穷。但是单单刷 JAVA 面试题就足够了吗&#xff1f; 答案显然是不够的&#xff01;那么为什么呢&#xff1f; 因为现在的程序员就业环境早就和两年前不可同日而语了。 如果你在两年前面试&#xff1a; 就拿 JVM 来说&#xff0c;刷面试题可能…

Springboot+vue.js+协同过滤推荐+余弦相似度算法实现新闻推荐系统

Springbootvue.js协同过滤推荐余弦相似度算法实现新闻推荐系统 - 简书 针对海量的新闻资讯数据&#xff0c;如何快速的根据用户的检索需要&#xff0c;完成符合用户阅读需求的新闻资讯推荐&#xff1f;本篇文章主要采用余弦相似度及基于用户协同过滤算法实现新闻推荐&#xff0…

SpringMvc详解

SpringMvc用来代替展示层Servlet&#xff0c;均属于Web层开发技术 Servlet是如何工作的 1、导入Servlet依赖坐标 2、创建一个Servlet接口实现类&#xff0c;重写其中的所有方法 3、在Servlet实现类上加上WebServlet注解&#xff0c;用来配置Servlet访问路径 4、启动Tomca…