一、概要

(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. Windows 系统如何完全卸载 VSCode

    0. 参考资料 Uninstall visual studio code in windows 1. 删不干净的用户数据 最近正在从 Sublime Text 3 环境切换到 VS Code,看重的是 ...

  2. 使用aop去自定义注解,实现用户在请求的时候记录下来,如日志功能等

    首先搞清楚aop的几个概念: AOP即是面向切面,是Spring的核心功能之一,主要的目的即是针对业务处理过程中的横向拓展,以达到低耦合的效果. 「切面(Aspect)」:一个关注点的模块化.以注解@ ...

  3. python常见面试题讲解(九)字符个数统计

    题目描述 编写一个函数,计算字符串中含有的不同字符的个数.字符在ACSII码范围内(0~127),换行表示结束符,不算在字符里.不在范围内的不作统计.注意是不同的字符 输入描述: 输入N个字符,字符在 ...

  4. 阿里巴巴MYSQL 开发规范

    转载请注明出处: (一) 建表规约 1. [强制]表达是与否概念的字段,必须使用 is_xxx 的方式命名,数据类型是 unsigned tinyint(1 表示是,0 表示否). 说明:任何字段如果 ...

  5. kafka 性能优化与常见问题优化处理方案

    本文为博主原创,未经允许不得转载: 1.  JVM参数优化设置 kafka是scala语言开发,运行在JVM上,需要对JVM参数合理设置,修改bin/kafka-start-server.sh中的jv ...

  6. C++数据结构(树)

    树是一种递归定义的数据结构,如果树中节点的各子树从左到右是有次序的,不能互换,则称该树为有序树,否则叫无序树. 关于树的节点: 节点拥有的子树的个数叫做节点的度 如果度为0,那么该节点叫做叶节点或终端 ...

  7. 用CI/CD工具Vela部署Elasticsearch + C# 如何使用

    Vela 除了可以帮我们编译.部署程序,利用它的docker部署功能,也能用来部署其他线上的docker镜像,例如部署RabbitMQ.PostgreSql.Elasticsearch等等,便于集中管 ...

  8. Spring Boot对接Oracle数据库

    Spring Boot对接Oracle数据库 最近学习了Oracle数据库,那么如何使用Spring Boot和MyBatis Plus对接Oracle数据库呢? 这就有了这篇随记,具体流程如下 1. ...

  9. SpringMVC03—RestFul和Controller

    控制器Controller 控制器复杂提供访问应用程序的行为,通常通过接口定义或注解定义两种方法实现. 控制器负责解析用户的请求并将其转换为一个模型. 在Spring MVC中一个控制器类可以包含多个 ...

  10. [转帖]TiDB 统计数据库占用大小的N种方法

    TiDB之路2022-03-06 3896 前言 TiDB 如何统计数据库占用空间大小 四种方法 方法一 TiDB 统计数据库占用大小的第一种方法是监控.通过查看 {cluster-name} - O ...