一、概要

(1)每个单页应用其实是一系列的 JS 文件,当用户请求网站时,网站返回一整个(或一系列)的 js 文件和 HTML,而当用户在某个页面内点击时,你需要告诉浏览器怎么加载另一个页面地址。单页应用中通常只有一个 index.html 文件的,所以浏览器自带的 <a> 链接 tag 并不能用来做单页应用的跳转,因此你需要一个在 React 中的路由实现。

然而 React 框架本身是不带路由功能的,因此如果你需要实现路由功能让用户可以在多个单页应用中跳转的话,就需要使用 React-Router。

(2)全局路由有常用两种路由模式可选:HashRouter 和 BrowserRouter

  • HashRouter:URL中采用的是hash(#)部分去创建路由,类似www.example.com/#/

  • BrowserRouter:URL采用真实的URL资源 这里我们采用BrowserRouter来创建路由

1.1、route的功能

1.2、路由通配符

/groups

/groups/admin

/users/:id

/users/:id/messages

/files/* /files/:id/*

二、使用

2.1、安装 React-Router

npm install react-router-dom(没有指定版本,默认最新版)

2.2、创建组件

在 src 文件夹里面创建一个 component / index / index.jsx 组件,在 index 文件夹里再创建3个孙组件( index / p1.jsx、index / p2.jsx、index / p3.jsx)

在component文件夹下,再创建一个user文件夹,里面放3个孙组件(user / u1.jsx、user / u2.jsx、user / u3.jsx)

以上,创建那么文件夹和文件的作用是为了方便测试而已,要使用的时候还是按照自己的实际需要好!!!

2.3、孙组件内容

p1.jsx代码如下:

import React from "react";

export default class Pone extends React.Component{
render(){
return(
<>
<h1>p1</h1>
</>
)
}
}

其他几个孙组件的内容大致一样就不展示了!

2.4、子组件内容

index.jsx 代码如下:

import React from "react";
import { NavLink,Outlet } from "react-router-dom"; export default class Index extends React.Component{
render(){
return(
<>
{/* 跳转页面到某个路由 */}
<NavLink to="p1">p1</NavLink>
<NavLink to="p2">p2</NavLink>
<NavLink to="p3">p3</NavLink>
<hr />
{/* 这个也是占位符,把子路由的内容放在这里 */}
<Outlet></Outlet>
</>
)
}
}

其他几个子组件的内容大致一样就不展示了!

2.5、父组件内容

App.js 代码如下:

import route from "./route";
import { NavLink,useRoutes } from "react-router-dom";
import './index.css' function App() {
// 占位符,相当于把路由放在这个地方
const element = useRoutes(route)
return (
<div className="App">
<NavLink to="/home">主页</NavLink>
<NavLink to="/user">用户</NavLink>
<hr />
{
element
}
</div>
);
} export default App;

2.6、创建路由表

在 src 文件夹下创建一个 route 文件夹下,在route文件夹下创建一个 index.js

具体代码如下:

// 组件
import Index from "../component/index";
import Pone from "../component/index/p1";
import Ptwo from "../component/index/p2";
import Pthere from "../component/index/p3"; import User from "../component/user/user";
import Uone from "../component/user/u1";
import Utwo from "../component/user/u2";
import Uthere from "../component/user/u3";
// 跳转页面的
import { Navigate } from "react-router-dom"; // 默认导出
// eslint-disable-next-line import/no-anonymous-default-export
export default [
// 路由规则
{
path:"/home",
element: <Index></Index>,
// 一级路由的子路由,即嵌套路由
children: [
{
path: "p1",
element: <Pone></Pone>
},
{
path: "p2",
element: <Ptwo></Ptwo>
},
{
path: "p3",
element: <Pthere></Pthere>
},
{
path:"",
element: <Navigate to="/home/p1"></Navigate>
}
]
},
{
path:"/",
element: <Navigate to="/home"></Navigate> // Navigate:页面的跳转;此规则用于重定向
},
{
path:"/user",
element: <User></User>,
children:[
{
path: "u1",
element: <Uone></Uone>
},
{
path: "u2",
element: <Utwo></Utwo>
},
{
path: "u3",
element: <Uthere></Uthere>
},
{
path:"",
element: <Navigate to="/user/u1"></Navigate>
}
]
} ]

2.7、入口文件内容(src/index.js)

 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:检测代码是否规范
// <React.StrictMode>
<BrowserRouter>
<App />
</BrowserRouter>
// </React.StrictMode> );

2.8、运行结果

三、跳转页面的方法

3.1、在路由表导入“ 注册 ” 的组件

// 该文件为路由表,定义一些路由信息
import { Navigate } from 'react-router-dom'
import React,{lazy} from 'react' // 动态加载组件
const Login = lazy(()=>import('../view/Login'))
const Register = lazy(()=>import('../view/Register')) // 解决懒加载报错问题
const fun = (Com)=>(<React.Suspense fallback={'loading...'}>
{Com}
</React.Suspense>
) export default [
{
path: '/Login',
element: fun(<Login/>)
},
{
path: '/Register',
element: fun(<Register/>)
},
{
path: '/',
element: <Navigate to="/Login"/>
}
]

3.2、使用useNavigate从登录页面跳转到注册页面

导入:

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

实现:

const navigate = useNavigate();
navigate('/path');

报错:

A component suspended while responding to synchronous input. This will cause the UI to be replaced with a loading indicator. To fix, updates that suspend should be wrapped with startTransition.

原因:

在响应同步输入时,某个组件发生了挂起(suspended)的情况,导致用户界面被替换为加载指示器。这通常是由于在渲染中,某个异步操作(如数据获取、网络请求等)耗时较长,导致组件挂起,从而影响了用户体验。

解决:

为了解决这个问题,React 18 引入了一个新的 API startTransition,用于告知 React 暂停当前渲染,直到异步操作完成后再继续渲染。你可以在组件中使用startTransition包装异步更新,以避免组件挂起的情况。

具体代码实现:

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

// 跳转页面
const navigate = useNavigate();
// 跳转到注册页面
function goRegister(){
// startTransition,用于告知 React 暂停当前渲染,直到异步操作完成后再继续渲染。
startTransition(() => {
// 包装异步更新,以避免组件挂起的情况。
navigate("/Register"); // 跳转到这个路由下的页面
});
}

关于React-Router6 (React 路由)的更多相关文章

  1. React中的路由系统

    React中的路由系统 提起路由,首先想到的就是 ASPNET MVC 里面的路由系统--通过事先定义一组路由规则,程序运行时就能自动根据我们输入的URL来返回相对应的页面.前端中的路由与之类似,前端 ...

  2. react router @4 和 vue路由 详解(五)react怎么通过路由传参

    完整版:https://www.cnblogs.com/yangyangxxb/p/10066650.html 7.react怎么通过路由传参? a.通配符传参(刷新页面数据不丢失) //在定义路由的 ...

  3. react router @4 和 vue路由 详解(三)react如何在路由里面定义一个子路由

    完整版:https://www.cnblogs.com/yangyangxxb/p/10066650.html 5.react如何在路由里面定义一个子路由?   a.引入在需要子路由的页面引入Rout ...

  4. react全家桶-路由

    /src目录下新增一个pages目录,用于存放渲染页面的组件 在/src/pages中新增一个Add.js文件 /src 下的index.js 路由:import React from 'react' ...

  5. 从 React Router 谈谈路由的那些事

    React Router 是专为 React 设计的路由解决方案,在使用 React 来开发 SPA (单页应用)项目时,都会需要路由功能,而 React Router 应该是目前使用率最高的. Re ...

  6. react 脚手架 及路由和 redux

    前提是我们需要下载 nodejs 使用 npm 下载 react 的脚手架,react-router-dom,redux 全局下载 react 的脚手架:npm i create-react-app ...

  7. react 中的路由 Link 和Route和NavLink

    route是配置,link是使用 https://blog.csdn.net/chern1992/article/details/77186118(copy) 嵌套路由一般使用Route,类似于vue ...

  8. react中,路由的使用。import {BrowserRouter,Switch,Route} from "react-router-dom";

      import React from "react"; import ReactDom  from "react-dom"; import {BrowserR ...

  9. AntDesign(React)学习-5 路由及使用Layout布局

    前言:学习目标实现点击登录按钮,直接进入后台布局页面,类似下面antd官网文档展示效果 ant.design访问 https://ant-design.gitee.io/components/menu ...

  10. react后台管理系统路由方案及react-router原理解析

        最近做了一个后台管理系统主体框架是基于React进行开发的,因此系统的路由管理,选用了react-router(4.3.1)插件进行路由页面的管理配置. 实现原理剖析 1.hash的方式   ...

随机推荐

  1. Codeforce:131A. cAPS lOCK

    原题链接 ╮(╯▽╰)╭这题题目一开始没看明白,导致wa几次.如果全是大写或者出了首字母是小写其他为大写,则转换为第一个字母大写,其他的小写 ,如果不是以上两种情况则不作处理. ╮(╯▽╰)╭水题还错 ...

  2. Deltix Round, Summer 2021 Div1 + Div2 A~E

    比赛链接:Here 1556A. A Variety of Operations 注意到2, 3操作不改变总和,1操作使得总和加上了一个偶数,故直接判断总和是否为偶数即可.如果和为偶数,只要判断c和d ...

  3. 2012年第三届蓝桥杯【C++省赛B组】

    第一题:微生物增殖 假设有两种微生物 X 和 Y X出生后每隔3分钟分裂一次(数目加倍),Y出生后每隔2分钟分裂一次(数目加倍). 一个新出生的X,半分钟之后吃掉1个Y,并且,从此开始,每隔1分钟吃1 ...

  4. OKR之剑·实战篇04:OKR执行过程优化的那些关键事

    作者:vivo 互联网平台产品研发团队 本文是<OKR 之剑>系列之实战第 4 篇--OKR执行过程不是一成不变的,团队和个人在执行中不断优化执行的具体行动,保障OKR的高效执行. 前言 ...

  5. 大数据(3)---HDFS客户端命令及java连接

    一.参数设置 之前有说到HDFS的备份数量和切块大小都是可以配置的,默认是备份3,切块大小默认128M 文件的切块大小和存储的副本数量,都是由客户端决定! 所谓的由客户端决定,是通过客户端机器上面的配 ...

  6. chage详解:liunx账户密码过期时处理

    公司安装elasticSearcher7.10.2版本时提示账户密码过期,可以做以下的处理方式: 一.查看账户的使用情况 chage -l baikang [root@localhost ~]# ch ...

  7. jmeter+badboy软件安装与使用

    目录: 一.软件下载安装 1.软件下载 2.安装过程 3.安装完成后界面,默认是已经开启录制模式 二.操作使用 1.访问sougou 2.搜索:mrwhite2020 3.选择导出jmx格式 4.使用 ...

  8. mysql 复制表结构创建表及复制表结构与数据创建表

    本文为博主原创,未经允许不得转载: 在开发过程或项目维护发布过程中,经常需要复制建表及复制表数据建表等,整理了以下四种常用的 mysql 命令. 1.  create like 复制表结构(包含索引, ...

  9. SV 自定义数据类型

    概述 自定义类型 枚举类型 定义枚举值 自定义枚举类型 枚举类型之间进行赋值是可以的 枚举类型可以赋值给整型,整型不能直接赋值给枚举类型 枚举类型 + 1 ==> 会进行隐式的转换,枚举类型转换 ...

  10. 探讨Java死锁的现象和解决方法

    死锁是多线程编程中常见的问题,它会导致线程相互等待,无法继续执行.在Java中,死锁是一个需要注意和解决的重要问题.让我们通过一系列详细的例子来深入了解Java死锁的现象和解决方法. 1. 什么是死锁 ...