一、概要

(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. #2059:龟兔赛跑(动态规划dp)

    Problem Description 据说在很久很久以前,可怜的兔子经历了人生中最大的打击--赛跑输给乌龟后,心中郁闷,发誓要报仇雪恨,于是躲进了杭州下沙某农业园卧薪尝胆潜心修炼,终于练成了绝技,能 ...

  2. vue 文件路径获取文件名

    例如: url 是//resource//20220819//kfz//调试.zip转换后结果为 调试.zip//文件路径获取文件名 getFileName(url) { let name = &qu ...

  3. mixin混合

    多个组件有相同的逻辑,抽离出来 mixin并不是完美的解决方案,会有一些问题 vue3提出composition api旨在解决这些问题

  4. windows10/liunx创建空大文件

    1.windows10创建空大文件打开cmd命令,进入需要创建文件的目录,使用以下命令创建 fsutil file createnew test001.txt 1073741824 最后的数字代表文件 ...

  5. java项目实战-mybatis-基本用法02接口绑定实现类-day23

    目录 1. 复习 什么是接口 什么是类? 2. mybatis接口绑定实现类 来实现查询 4. 参数的传递 5 插入数据 1. 复习 什么是接口 什么是类? public interface Spea ...

  6. GO 指针数据类型的使用

    转载请注明出处: 在Go语言中,指针类型允许直接访问和修改某个变量的内存地址.通过使用指针,我们可以在函数之间共享数据或者在函数内部修改外部变量的值. 以下是关于Go语言指针类型的一些重要语法和示例: ...

  7. 文心一言 VS 讯飞星火 VS chatgpt (183)-- 算法导论13.4 7题

    七.用go语言,假设用 RB-INSERT 将一个结点 x 插入一棵红黑树,紧接着又用 RB-DELETE 将它从树中删除.结果的红黑树与初始的红黑树是否一样?证明你的答案. 文心一言: 首先,我们需 ...

  8. FinalShell上传文件失败

    1.问题 上传文件失败,如图所示,即使切换至root用户 2.解决方式 这里在建立SSH连接时,就必须使用root用户,而若使用普通用户,即使在其中切换至root用户,也无法上传. 所以重新建立一个r ...

  9. CSS - 使图片自适应

    img {         height: 100%;         object-fit: cover; }

  10. [转帖]46岁加入谷歌,51岁发明Go,他的编程原则影响了一大批程序员!

    https://www.zhihu.com/tardis/zm/art/551945410?source_id=1005 今年3月,万众瞩目的Go 1.18版本发布,Go终于开始支持泛型了!该版本不仅 ...