【React Router 6 快速上手一】重定向Navigate / useRoutes路由表 / 嵌套路由Outlet

news2025/7/10 6:09:30

前言

博主主页👉🏻蜡笔雏田学代码
专栏链接👉🏻React专栏
之前学习了react-router-dom5版本的相关内容
参考文章👉🏻React路由(详解版)和 路由的模糊匹配,重定向以及嵌套路由
今天来学习react-router-dom6版本的相关知识!
感兴趣的小伙伴一起来看看吧~🤞

在这里插入图片描述

文章目录

  • 概述
  • 1. 一级路由Routes
    • 基本使用
  • 2. 重定向Navigate
    • 作用
  • 3. NavLink高亮
    • 代码优化实现复用
  • 4. useRoutes()路由表
    • 作用
  • 5. 嵌套路由Outlet
    • 作用

概述

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

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

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

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

1. 一级路由Routes

<BrowserRouter>

  1. 说明:<BrowserRouter> 用于包裹整个应用,v6版本中,依然需要用<BrowserRouter>标签将App组件包裹起来。
  2. 示例代码:
import React from 'react';
import ReactDOM from 'react-dom/client'
import App from './App'
import { BrowserRouter } from 'react-router-dom'

const root = ReactDOM.createRoot(document.getElementById('root'))

root.render(
  <React.StrictMode>
    <BrowserRouter>
      <App />
    </BrowserRouter>
  </React.StrictMode>
)

<HashRouter>

  1. 说明:作用与<BrowserRouter>一样,但<HashRouter>修改的是地址栏的hash值。
  2. 备注:6.x版本中<HashRouter><BrowserRouter> 的用法与 5.x 相同。

基本使用

这里还是以之前学过的react-router-dom@5的案例来分析。

在这里插入图片描述

App.jsx

import React from 'react'
import { NavLink, Routes, Route } from 'react-router-dom'
import About from './pages/About'
import Home from './pages/Home'

export default function App() {
  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/> 与 <Route/>

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

2. 重定向Navigate

在v5版本中,路由的重定向使用的是Redirect,在v6版本中使用的是Navigate

v5版本的写法:
import { Redirect } from 'react-router-dom'
<Redirect to="/home" />

v6版本的写法:
import { Navigate } from 'react-router-dom'
<Route path='/' element={<Navigate to='/about' />} />

作用

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

Navigate会接收两个属性: to 和 replace

<Navigate to='/about' replace={false}/>

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

路由的跳转有两种模式,push和replace,push模式会将这个url压入路由history栈顶; 而replace模式会将栈顶的url替换 。

Navigate组件可以设置replace的值为true或false,默认值为false,所以默认为push跳转。

3. NavLink高亮

在这里插入图片描述

在v5版本中,实现NavLink高亮使用的是NavLink组件标签中的activeClassName属性,当你点击NavLink标签时,加哪个样式的类名。

<NavLink activeClassName='demo' className="list-group-item" to="/about">About</NavLink>
<NavLink activeClassName='demo' className="list-group-item" to="/home">Home</NavLink>

在v6版本中,想要实现自定义的类名,需要把className的值写成一个函数

//高亮样式
<style>
    .demo {
      background-color: orange !important;
      color: white !important;
    }
</style>
<NavLink className={({ isActive }) => 
{ return isActive ? 'list-group-item demo' : 'list-group-item' }} to="/about">
About
</NavLink>

/*
	默认情况下,当Home的子组件匹配成功,Home的导航也会高亮,
	当NavLink上添加了end属性后,若Home的子组件匹配成功,则Home的导航没有高亮效果。
*/
<NavLink to="home" end >home</NavLink>

代码优化实现复用

将ClassName的值封装成一个函数

function computedClassName({ isActive }) {
  return isActive ? 'list-group-item demo' : 'list-group-item'
}
...
<NavLink className={computedClassName} to="/about">About</NavLink>

4. useRoutes()路由表

作用

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

在src下新建一个routes文件夹,专门用于维护路由表,应用中的路由都存放在路由表中。

在这里插入图片描述

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='/about' />
  }
]

App.jsx

import React from 'react'
import { NavLink, useRoutes } from 'react-router-dom'
import routes from './routes/index';

export default function App() {
  
  // useRoutes可以用路由表生成<Routes>...</Routes>结构
  // 根据路由表生成对应的路由规则
  const element = useRoutes(routes)
 
  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">
              {/* 注册路由 */}
              {element}
            </div>
          </div>
        </div>
      </div>
    </div>
  )
}

5. 嵌套路由Outlet

作用

<Route>产生嵌套时,渲染其对应的后续子路由 (类似于vue中 < < <router-view/>)

在这里插入图片描述

如图,News组件和Message组件是Home的子组件

将二级路由放在children属性中注册:

...
{
    path: '/home',
    element: <Home />,
    children: [
      {
        path: 'news',
        element: <News />
      },
      {
        path: 'message',
        element: <Message />
      }
    ]
  },
...

Home.jsx

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

export default function Home() {
  return (
    <div>
      <h2>Home组件内容</h2>
      <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>
        {/* 指定路由组件呈现的位置 */}
        <Outlet />
      </div>
    </div>
  )
}

< < <NavLink className=‘list-group-item’ to=‘news’>News < < </NavLink>
中的to属性有三种写法:

  1. to=‘news’
  2. to=‘./news’
  3. to=‘/home/news’ //这一种与v5版本中一样

今天的分享就到这里啦✨ \textcolor{red}{今天的分享就到这里啦✨} 今天的分享就到这里啦

原创不易,还希望各位大佬支持一下 \textcolor{blue}{原创不易,还希望各位大佬支持一下} 原创不易,还希望各位大佬支持一下

🤞 点赞,你的认可是我创作的动力! \textcolor{green}{点赞,你的认可是我创作的动力!} 点赞,你的认可是我创作的动力!

⭐️ 收藏,你的青睐是我努力的方向! \textcolor{green}{收藏,你的青睐是我努力的方向!} 收藏,你的青睐是我努力的方向!

✏️ 评论,你的意见是我进步的财富! \textcolor{green}{评论,你的意见是我进步的财富!} 评论,你的意见是我进步的财富!

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

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

相关文章

vue安装及环境配置

目录 1.安装 Node.js 2.配置默认安装目录和缓存日志目录 3.配置环境变量 4.配置淘宝镜像 5.安装vue和脚手架 6.创建并运行项目 1.安装 Node.js Download | Node.js 在这里&#x1f446;下载的是最新版&#xff0c;如果要安装以前的版本&#x1f447;&#xff0c;页面往下…

3分钟让你学会axios在vue项目中的基本用法(建议收藏)

Axios酸狗来教你 提示&#xff1a;本篇详解axios在vue项目中的实例。在使用Vue.js框架开发前端项目时&#xff0c;会经常发送ajax请求服务端接口&#xff0c;在开发过程中&#xff0c;需要对axios进一步封装&#xff0c;方便在项目中的使用。 文章目录Axios酸狗来教你Axios简介…

JavaScript之正则表达式的使用方法详细介绍

目录 I. 序言&#xff1a;JavaScript中正则表达式的使用场景 II. 创建第一个正则表达式 III. 常见的正则表达式属性 &#x1f4d5; 三种匹配规则 &#x1f4d5; 五种常见属性 &#x1f4d5; 规则g的使用详解 IV. 常见的正则表达式方法举例介绍 &#x1f4d8; test方法 …

idea构建web项目-超详细教程

1、idea构建web项目 idea构建web项目的超级详细教程&#xff0c;一步一步来&#xff0c;完全没问题&#xff01; 1、新建一个空项目 2、新建java模块&#xff0c;名为webDemo1 3、选择webDemo1右键&#xff0c;选择Add Framework Support 选择Web Application 4、在WEB-…

Geeker-Admin项目跟做笔记(vue3+vite+pinia)

文章目录一、路由配置&#xff08;一&#xff09; 静态路由&#xff08;二&#xff09;动态路由二、axios的配置1. 创建axiosCancel.ts文件&#xff0c;用于有pending后直接取消2. axios封装3. 使用三、pinia仓库的使用四、Header 设计笔记1. 国际化&#xff08;中英文切换&…

【小程序开发】—— 封装自定义弹窗组件

文章目录&#x1f34b;前言&#xff1a;&#x1f34d;正文1、探讨需求封装popup自定义弹窗组件2、实战开发弹窗组件2.1 子组件内容 popup.vue文件2.2 父组件引用子组件3、效果图预览3.1 不使用具名插槽的原有样式效果3.2 使用具名插槽之后样式效果&#x1f383;专栏分享&#x…

快速掌握Nginx部署前端项目(从Nginx安装配置及部署都非常详细哦!)

前言&#xff1a; 之前在Linux系统中部署了后端项目&#xff0c;今天继续来给大家分享如何部署前端项目。 涉及到了Nginx的简单介绍以及Nginx如何安装及配置并且能够部署前端项目 Nginx是一个轻量级的反向代理web服务器&#xff0c;在当今应用地非常广泛&#xff0c;特别是前…

vue的proxy代理详解

一、proxy常用参数说明 module.exports {publicPath: "/",devServer: {proxy: {"/api": {// 代理名称 凡是使用/api开头的地址都是用此代理target: "http://1.2.3.4:5000/", // 需要代理访问的api地址changeOrigin: true, // 允许跨域请求pa…

[Node.js]如何在IDEA中配置Node.js

【目录】 一、下载Node.js 二、安装Node.js 三、配置Node.js 四、测试Node.js 一、下载Node.js 官网下载链接&#xff1a;Node.js 点击下图红色标注区域&#xff0c;即可下载msi文件 二、安装Node.js 打开msi文件 一路点击“Next”&#xff08;建议自定义文件安装路径&#xf…

vue3的基本使用(超详细)

一、初识vue3 1.vue3简介 2020年9月18日&#xff0c;vue3发布3.0版本&#xff0c;代号大海贼时代来临&#xff0c;One Piece特点&#xff1a; 无需构建步骤&#xff0c;渐进式增强静态的 HTML在任何页面中作为 Web Components 嵌入单页应用 (SPA)全栈 / 服务端渲染 (SSR)Jams…

使用小程序制作一个电子木鱼,功德+1

此文主要通过小程序制作一个敲木鱼的小工具,在心烦意乱的时候缓解一下焦虑。 一、创建小程序二、设计页面三、代码块一、创建小程序 访问微信公众平台,点击账号注册。选择小程序,并在表单填写所需的各项信息进行注册。在开发管理选择开发设置,将AppID及AppSecret复制出来进…

Vue路由导航报错:NavigationDuplicated: Avoided redundant navigation to current location解决方法

点击vue路由跳转&#xff0c;控制台报错&#xff1a;Avoided redundant navigation to current location: “/xxxxxx“解决方法 一、描述问题 在使用this.$router.push跳转页面时候&#xff0c;重复点击菜单引起路由重复报错 比如当前页面显示区是路由组件‘/cats’&#xff…

关于js 中 try catch用法

try…catch语法&#xff0c;简单来说就是用来捕获异常的&#xff0c;我就简述一下我遇到的问题 当使用vuex在actions发请求时&#xff0c;这个接口不仅可以添加购物车数据&#xff0c;同时也可更新产品的数量&#xff0c;我就在更新产品数量的地方出现了问题&#xff0c; 先说说…

HTML生日快乐-生日祝福(烟花+粒子动画)

本人对前端不太了解&#xff0c;对网上代码进行简单修改&#xff0c;完成部署。 粒子动画&#xff1a;https://github.com/kennethcachia/shape-shifter 烟花&#xff1a;网上有许多相关代码&#xff0c;未找到原作者 效果&#xff1a;http://8.130.106.21/HappyBirthday/Happy…

原生HTML+CSS+JS制作自己的导航主页(前端大作业,源码+步骤详解)

文章目录前言一、插入背景二、头部1.导航栏2. 优化导航栏3 时间4. 搜索框三、主体四、底部五、背景泡沫球特效六、note小便签七、全部代码1. index.html2. style.css3. index.js八、总结链接&#xff1a;https://pan.baidu.com/s/1uaRCJXyIrY56NXabau4wjw?pwdLDL6 提取码&…

Vue3详细教程

一.Vue3的介绍 相信大家都已经学习过Vue2了&#xff0c;对Vue有了一定的了解。那么今天我们就一起来学习有关Vue3的知识点。那为什么要学习Vue3呢&#xff0c;主要是他有以下的特点。 &#xff08;1&#xff09;新增组合式api &#xff08;2&#xff09;更加接近原生 &#xf…

JavaWeb web.xml配置详解

参考&#xff1a; XML 教程Java web之web.xml配置详解 Javaweb三大组件是&#xff1a;Servlet&#xff0c;Filter&#xff0c;Listener。 1、Servlet Servlet作为中转处理的容器&#xff0c;连接了客户端和服务器端的信息交互和处理。2、Filter 拦截用户请求&#xff0c;在服…

tomcat下载安装及配置教程

之前选择的版本是tomcat 10.0按照下面流程走了一遍&#xff0c;发现一直是未发现&#xff08;Not Found&#xff09;的状态。 后来&#xff0c;我换成了tomcat 9版本就OK了 下面以tomcat 9.0版本为例讲述其过程 一、下载Tomcat及解压 官网&#xff1a; http://tomcat.apach…

Vue基础知识总结 9:vue webpack打包原理

&#x1f345; 作者简介&#xff1a;哪吒&#xff0c;CSDN2021博客之星亚军&#x1f3c6;、新星计划导师✌、博客专家&#x1f4aa; &#x1f345; 哪吒多年工作总结&#xff1a;Java学习路线总结&#xff0c;搬砖工逆袭Java架构师 &#x1f345; 关注公众号【哪吒编程】&#…

解决npm warn config global `--global`, `--local` are deprecated. use `--location=global` instead.

在安装配置node时&#xff0c;cmd检查node没问题 但是检查npm就出现npm warn config global --global, --local are deprecated. use --locationglobal instead.的报警 问题出现在&#xff0c;以前版本npm的命令一般时XXX -g 但是随着版本更替&#xff0c;这个老方法被弃用了&a…