热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ReactRouter6.x版本使用

React-Router6.x版本使用一.对比ReactRouter5.x版本二.Router安装三.Component1.路由模式BrowserRouter和HashRouter




React - Router 6.x 版本使用


  • 一. 对比 ReactRouter 5.x 版本
  • 二. Router 安装
  • 三. Component
    • 1. 路由模式 BrowserRouter 和 HashRouter
    • 2. Routes 与 Route
    • 3. Link
    • 4. NavLink
    • 5. Navigate
    • 6. Outlet

  • 四. Hooks
    • 1. useRoutes() —— 路由表
    • 2. 路由传参
      • 2.1 useParams() —— params传参
      • 2.2 useSearchParams() —— search传参(query传参)
      • 2.3 useLocation() —— state传参

    • 3. useNavigate() —— 编程式路由导航
    • 4. useInRouterContext() —— 判断组件是否在 Router的上下文中呈现
    • 5. useNavigationType() —— 返回当前的导航类型
    • 6. useOutlet() —— 呈现当前组件中渲染的嵌套路由
    • 7. useResolvedPath() —— 解析URL值





React Router 6.0 :https://reactrouter.com/en/main/start/overview



一. 对比 ReactRouter 5.x 版本
  1. 包大小的不同 V5 大小在20.8k左右,压缩后在7.3k左右;V6 大小在10.8k左右,压缩后在3.8k左右
  2. 内置组件的变化:移除 ,新增 等。
  3. 语法的变化:component={About} 变为 element={}等。
  4. 新增多个hook:useParamsuseNavigateuseMatch等。
  5. 官方明确推荐使用函数式组件了。

二. Router 安装

yarn add react-router-dom@6.4.5




npm install react-router-dom@6.4.5



三. Component

1. 路由模式 BrowserRouter 和 HashRouter



6.x版本中 的用法与 5.x 相同。




https://blog.csdn.net/Jie_1997/article/details/126740893



2. Routes 与 Route


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

<Routes>
{/* path属性用于定义路径&#xff0c;element属性用于定义当前路径所对应的组件 */}
<Route path&#61;"/login" element&#61;{ />}>Route>
{/* 用于定义嵌套路由&#xff0c;home是一级路由&#xff0c;对应的路径/home */}
<Route path&#61;"home" element&#61;{ />}>
{/* page1 和 page2 是二级路由,对应的路径是/home/page1 或 /home/page2 */}
<Route path&#61;"page1" element&#61;{ />}>Route>
<Route path&#61;"page2" element&#61;{ />}>Route>
Route>
{/*
Route也可以不写element属性, 表示用于展示嵌套的路由
./user 对应的路径是/users/user
/user 对应根路径/user
user 与./user意思相同&#xff0c;对应根路径/users/user
*/}
<Route path&#61;"users">
<Route path&#61;"user" element&#61;{ />} />
Route>
Routes>

3. Link


  1. 用于修改URL&#xff0c;且不发送网络请求&#xff08;路由链接&#xff09;。
  2. 使用时&#xff0c;外侧需要用包裹。

import React from &#39;react&#39;
export default function Demo() {
return (
<div>
<Link to&#61;"/路径">按钮</Link>
</div>
)
}

4. NavLink


  1. 组件类似&#xff0c;且可实现导航的“高亮”效果
  2. NavLink 默认类名是 active
  3. NavLink上添加了end属性后&#xff0c;若路由的子组件匹配成功&#xff0c;则路由的导航没有高亮效果。

{/* 自定义类名 */}
<NavLink
to&#61;"login"
className&#61;{({ isActive }) &#61;> {
console.log(isActive);
return isActive ? "class1" : "class2";
}}
>
login
</NavLink>

{/* 若Home的子组件匹配成功&#xff0c;则Home的导航没有高亮效果 */}
<NavLink to&#61;"home" end >homeNavLink>

5. Navigate


  1. 只要组件被渲染&#xff0c;就会修改路径&#xff0c;切换视图
  2. replace属性用于控制跳转模式&#xff08;push 或 replace&#xff0c;默认是push&#xff09;

import React, { useState } from "react";
import { Navigate } from "react-router-dom";
export default function Home() {
const [count, setCount] &#61; useState(1);
return (
<div>
<h3>Home组件</h3>
{/* 根据count的值决定是否切换视图 */}
{count &#61;&#61;&#61; 1 ? (
<h4>count的值为{count}</h4>
) : (
<Navigate to&#61;"/about" replace&#61;{true} />
)}
{/* 修改count值 */}
<button onClick&#61;{() &#61;> setCount(2)}>修改count值为2</button>
</div>
);
}

6. Outlet



产生路由嵌套时&#xff0c;渲染其对应的后续子路由。


import React from "react";
import { NavLink, Outlet } from "react-router-dom";
export default function Home() {
return (
<div>
<h2>Home组件内容</h2>
<div>
{/* 子路由 */}
<ul>
<li>
<NavLink replace to&#61;"page1">page1</NavLink>
</li>
<li>
<NavLink to&#61;"page2">page2</NavLink>
</li>
</ul>
{/* 指定子路由组件呈现的位置 */}
<Outlet />
</div>
</div>
);
}

四. Hooks

1. useRoutes() —— 路由表



根据路由表&#xff0c;动态创建



  1. src 文件夹下创建 routes 文件夹&#xff0c;用于存放路由文件
  2. src/routes 文件夹下创建 index.js 文件&#xff0c;用于配置路由

    //路由表配置&#xff1a;src/routes/index.js
    import About from "../pages/About";
    import Home from "../pages/Home";
    import { Navigate } from "react-router-dom";
    export default [
    {
    path: "/about",
    element: <About />,
    },
    {
    path: "/home",
    element: <Home />,
    },
    {
    path: "/",
    element: <Navigate to&#61;"/about" />,
    },
    ];

  3. App.js 文件中引入使用

    import React from "react";
    import { NavLink, useRoutes } from "react-router-dom";
    import routes from "./routes";
    export default function App() {
    //根据路由表生成对应的路由规则
    const element &#61; useRoutes(routes);
    return (
    <div className&#61;"app">
    <div className&#61;"menu">
    {/* 路由链接 */}
    <NavLink to&#61;"/about">About</NavLink>
    <NavLink to&#61;"/home">Home</NavLink>
    </div>
    <div className&#61;"body">
    {/* 注册路由 */}
    {element}
    </div>
    </div>
    );
    }


2. 路由传参



传递参数id&#xff0c;参数值为001



2.1 useParams() —— params传参


  • 路由设置

    // 路由表形式
    {
    path: "detail/:id",
    element: <Detail />,
    },

    // 标签形式
    <Routes>
    <Route path&#61;"detail/:id" element&#61;{<Detail />} />
    </Routes>

  • 路由链接传参

    <Link to&#61;{&#96;detail/001&#96;}>传参Link>

  • 接收参数

    import React from "react";
    import { useParams } from "react-router-dom";
    export default function Detail() {
    // 接收参数
    const { id, title, content } &#61; useParams();
    return <div>Detail</div>;
    }


2.2 useSearchParams() —— search传参&#xff08;query传参&#xff09;


  • 路由设置

    // 路由表形式
    {
    path: "detail",
    element: <Detail />,
    },

    // 标签形式
    <Routes>
    <Route path&#61;"detail" element&#61;{<Detail />} />
    </Routes>

  • 路由链接传参

    传参Link>

  • 接收参数

    import React from "react";
    import { useSearchParams } from "react-router-dom";
    export default function Detail() {
    // 返回一个包含两个值的数组&#xff0c;内容分别为&#xff1a;当前的seaech参数、更新search的函数
    const [search, setSearch] &#61; useSearchParams();
    // 取出对应参数
    const id &#61; search.get("id");
    return <div>Detail</div>;
    }


2.3 useLocation() —— state传参


  • 路由设置

    // 路由表形式
    {
    path: "detail",
    element: <Detail />,
    },

    // 标签形式
    <Routes>
    <Route path&#61;"detail" element&#61;{<Detail />} />
    </Routes>

  • 路由链接传参

    <Link
    to&#61;"detail"
    state&#61;{{
    id: "001",
    }}
    >

    传参
    Link>

  • 接收参数

    import React from "react";
    import { useLocation } from "react-router-dom";
    export default function Detail() {
    // 接收参数
    const { state } &#61; useLocation();
    return <div>Detail</div>;
    }


3. useNavigate() —— 编程式路由导航


  1. 指定具体的路径

    import React from "react";
    import { useNavigate } from "react-router-dom";
    export default function Demo() {
    const navigate &#61; useNavigate();
    const handle &#61; () &#61;> {
    navigate(
    "detail", //指定路径
    {
    replace: false, //是否为 replace 模式
    state: {
    id: "001", //state 传参
    },
    }
    );
    };
    return (
    <div>
    <button onClick&#61;{handle}>跳转</button>
    </div>
    );
    }

  2. 传入数值&#xff0c;前进或后退

    import React from "react";
    import { useNavigate } from "react-router-dom";
    export default function Demo() {
    const navigate &#61; useNavigate();
    const handle &#61; () &#61;> {
    navigate(-1);
    // navigate(1); //前进
    };
    return (
    <div>
    <button onClick&#61;{handle}>后退</button>
    </div>
    );
    }


4. useInRouterContext() —— 判断组件是否在 Router的上下文中呈现



如果组件在 的上下文中呈现&#xff0c;则 useInRouterContext 钩子返回 true&#xff0c;否则返回 false


import React from "react";
import { useInRouterContext } from "react-router-dom";
export default function Demo() {
// 打印判断
console.log(useInRouterContext());
return <div>Demo</div>;
}

5. useNavigationType() —— 返回当前的导航类型



  1. 返回当前的导航类型&#xff08;用户是如何来到当前页面的&#xff09;
  2. 返回值&#xff1a;POPPUSHREPLACE
  3. POP是指在浏览器中直接打开了这个路由组件&#xff08;刷新页面&#xff09;

import React from "react";
import { useNavigationType } from "react-router-dom";
export default function Dome() {
// 打印查看
console.log(useNavigationType());
return <div>Dome</div>;
}

6. useOutlet() —— 呈现当前组件中渲染的嵌套路由

import React from "react";
import { NavLink, Outlet, useOutlet } from "react-router-dom";
export default function Home() {
/**
* useOutlet() 当前组件中渲染的嵌套路由
* 如果嵌套路由没有挂载,则result为null
* 如果嵌套路由已经挂载,则展示嵌套的路由对象
*/

console.log(useOutlet());
return (
<div>
<h2>Home组件内容</h2>
<div>
{/* 子路由 */}
<ul>
<li>
<NavLink replace to&#61;"page1">page1</NavLink>
</li>
<li>
<NavLink to&#61;"page2">page2</NavLink>
</li>
</ul>
{/* 指定子路由组件呈现的位置 */}
<Outlet />
</div>
</div>
);
}

7. useResolvedPath() —— 解析URL值

import React from "react";
import { useResolvedPath } from "react-router-dom";
export default function Demo() {
// 解析其中的&#xff1a;path、search、hash值
console.log(useResolvedPath("/user?id&#61;001&name&#61;tom#qwe"));
return <div>Demo</div>;
}






推荐阅读
  • 本文介绍了在rhel5.5操作系统下搭建网关+LAMP+postfix+dhcp的步骤和配置方法。通过配置dhcp自动分配ip、实现外网访问公司网站、内网收发邮件、内网上网以及SNAT转换等功能。详细介绍了安装dhcp和配置相关文件的步骤,并提供了相关的命令和配置示例。 ... [详细]
  • 单页面应用 VS 多页面应用的区别和适用场景
    本文主要介绍了单页面应用(SPA)和多页面应用(MPA)的区别和适用场景。单页面应用只有一个主页面,所有内容都包含在主页面中,页面切换快但需要做相关的调优;多页面应用有多个独立的页面,每个页面都要加载相关资源,页面切换慢但适用于对SEO要求较高的应用。文章还提到了两者在资源加载、过渡动画、路由模式和数据传递方面的差异。 ... [详细]
  • RouterOS 5.16软路由安装图解教程
    本文介绍了如何安装RouterOS 5.16软路由系统,包括系统要求、安装步骤和登录方式。同时提供了详细的图解教程,方便读者进行操作。 ... [详细]
  • Hibernate延迟加载深入分析-集合属性的延迟加载策略
    本文深入分析了Hibernate延迟加载的机制,特别是集合属性的延迟加载策略。通过延迟加载,可以降低系统的内存开销,提高Hibernate的运行性能。对于集合属性,推荐使用延迟加载策略,即在系统需要使用集合属性时才从数据库装载关联的数据,避免一次加载所有集合属性导致性能下降。 ... [详细]
  • 本文总结了在编写JS代码时,不同浏览器间的兼容性差异,并提供了相应的解决方法。其中包括阻止默认事件的代码示例和猎取兄弟节点的函数。这些方法可以帮助开发者在不同浏览器上实现一致的功能。 ... [详细]
  • 本文讨论了将HashRouter改为Router后,页面全部变为空白页且没有报错的问题。作者提到了在实际部署中需要在服务端进行配置以避免刷新404的问题,并分享了route/index.js中hash模式的配置。文章还提到了在vueJs项目中遇到过类似的问题。 ... [详细]
  • 动态多点××× 单云双HUB
    动态多点是一个高扩展的IPSEC解决方案传统的ipsecS2S有如下劣势1.中心站点配置量大,无论是采用经典ipsec***还是采用greoveripsec多一个分支 ... [详细]
  •     系统采用jeeplus框架(ssm+redis+shiro+mongodb+redis),默认是做了JSP未做前后端分离,由于业务需要已经多终端使用的需求(H5、小程序等) ... [详细]
  • react项目无法编译2.npm错误信息: ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  •        在搭建Hadoop环境之前,请先阅读如下博文,把搭建Hadoop环境之前的准备工作做好,博文如下:       1、CentOS6.7下安装JDK,地址:http:b ... [详细]
  • 前言折腾了一段时间hadoop的部署管理,写下此系列博客记录一下。为了避免各位做部署这种重复性的劳动,我已经把部署的步骤写成脚本,各位只需要按着本文把脚本执行完,整个环境基本就部署 ... [详细]
  • 如何在Vue项目中安装和使用VUX组件?
    vux2模板fork自webpack模板,基本和官方同步。1、默认为webpack2模板npminstallvue-cli-g如果还没安装vueinitairyla ... [详细]
  • MapReduce 切片机制源码分析
     总体来说大概有以下2个大的步骤1.连接集群(yarnrunner或者是localjobrunner)2.submitter.submitJobInternal()在该方法中会创建 ... [详细]
author-avatar
梅焱my
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有