React:Router路由

ReactRouter引入

在index.js里编辑,创建路由,绑定路由

import React from 'react';
import ReactDOM from 'react-dom/client';
import './index.css';
import reportWebVitals from './reportWebVitals';
import { createBrowserRouter, RouterProvider } from "react-router-dom";
//1、创建router实例对象并配置路由对应关系
const router=createBrowserRouter([{path: '/login',element:<div>我是登录页</div>
},{path: '/article',element: <div>我是文章页</div>}])const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(<React.StrictMode>{/* { 2、路由绑定} */}<RouterProvider router={router}></RouterProvider></React.StrictMode>
);reportWebVitals();

效果是这样,可以输入路径进入对应页面

ReactRouter抽象路由模块


按照普通开发的流程使用Router,创建page文件夹,在文件夹内部创建Login和Article文件夹,在两个文件夹内部各自创建index.js文件

在 React 项目中,通常已经配置好了 Babel 和 Webpack,因此开发者可以直接在 JS 文件中使用 JSX,而无需额外配置。

然后配置路径和组件的对应关系,创建路由文件夹,在里面创建index.js文件

import Login from "../page/Login";
import Article from "../page/Article";
import { BrowserRouter, createBrowserRouter } from "react-router-dom";
const router=createBrowserRouter([{ path: '/login',element: <Login/>}, {path: '/article',element: <Article/>}
])
export default router

然后在index.js里引入

import React from 'react';
import ReactDOM from 'react-dom/client';
import './index.css';
import reportWebVitals from './reportWebVitals';
import { createBrowserRouter, RouterProvider } from "react-router-dom";
//1、引入router
import router from './router';const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(<React.StrictMode>{/* 2、将router传入RouterProvider */}<RouterProvider router={router}></RouterProvider></React.StrictMode>
);reportWebVitals();

这个page在view里通常叫views

路由导航

比如登录页面,在登录以后就会拿着登录的用户信息传递给下一个路由,打开新页面

有两种方式实现路由导航,一种叫声明式导航,一种叫编程式导航

这是声明式

在Login路由里调用Link组件

import {Link} from 'react-router-dom'
const Login = () => {return <div>我是登录页<Link to='/article'>点我跳转至文章页</Link></div>
}
export default Login

Link被识别为a链接

这是编程式

点击a链接即可跳转到Article页面

绑定点击事件,调用方法进行路由跳转

import { useNavigate } from "react-router-dom"
const Article = () => {const navigate=useNavigate()return <div>我是文章页<button onClick={()=>{navigate('/login')}}>跳转至登陆界面</button></div>
}
export default Article

在路由里传参

两种写法

searchParams传参

把参数以url字符串的格式传入

协议://域名/路径?查询参数#哈希
import { useNavigate } from "react-router-dom"
const Article = () => {const navigate=useNavigate()return <div>我是文章页<button onClick={()=>{navigate('/login')}}>跳转至登陆界面</button><button onClick={()=>{navigate('/login?id=101&name=jack')}}>searchParams传参</button></div>
}
export default Article

获取传递过来的参数params.get()

import { Link } from 'react-router-dom'
import { useSearchParams } from 'react-router-dom'
const Login = () => {const [params] = useSearchParams()const id = params.get('id')const name = params.get('name')return <div>我是登录页<Link to='/article'>点我跳转至文章页id:{id},name:{name}</Link></div>
}
export default Login

params传参

在路由配置的path里加上【:id】加上动态参数才知道你获取的是什么

动态参数(即占位符)

import Login from "../page/Login";
import Article from "../page/Article";
import { BrowserRouter, createBrowserRouter } from "react-router-dom";
const router=createBrowserRouter([{ path: '/login/:id',//动态路由,通过useParams获取element: <Login/>}, {path: '/article',element: <Article/>}
])
export default router

然后在Article路由处直接传递参数101,

import { useNavigate, useParams } from "react-router-dom"
const Article = () => {const navigate = useNavigate()return <div>我是文章页<button onClick={()=>{navigate('/login')}}>跳转至登陆界面</button><button onClick={()=>{navigate('/login?id=101&name=jack')}}>searchParams传参</button><button onClick={()=>{navigate('/login/101')}}>Params传参</button></div>
}
export default Article

在Login页面显示:

import { Link } from 'react-router-dom'
import { useSearchParams } from 'react-router-dom'
import {useParams } from 'react-router-dom'
const Login = () => {const params = useParams()const id = params.idreturn <div>我是登录页<Link to='/article'>点我跳转至文章页id:{id}</Link><div>{id}</div></div>
}
export default Login

如果传递多个数据,可以在url后面接着写:

//Article
import { useNavigate, useParams } from "react-router-dom"
const Article = () => {const navigate = useNavigate()return <div>我是文章页<button onClick={()=>{navigate('/login')}}>跳转至登陆界面</button><button onClick={()=>{navigate('/login?id=101&name=jack')}}>searchParams传参</button><button onClick={()=>{navigate('/login/101/jack')}}>Params传参</button></div>
}
export default Article
//Login
import { Link } from 'react-router-dom'
import { useSearchParams } from 'react-router-dom'
import {useParams } from 'react-router-dom'
const Login = () => {const params = useParams()const id = params.idconst name = params.namereturn <div>我是登录页<Link to='/article'>点我跳转至文章页</Link><div>id:{id}name:{name}</div></div>
}
export default Login
//Router
import Login from "../page/Login";
import Article from "../page/Article";
import { BrowserRouter, createBrowserRouter } from "react-router-dom";
const router=createBrowserRouter([{ path: '/login/:id/:name',//动态路由,通过useParams获取element: <Login/>}, {path: '/article',element: <Article/>}
])
export default router

嵌套路由配置

在嵌套路由中,父级路由就像一个文件夹,子级路由就像文件夹里的文件。要在父级路由中正确显示子级路由的内容,就需要使用<Outlet/>作为二级路由的出口。

在page下创建一个新文件夹充当一级路由:

//layout/index.js
import { Link ,Outlet} from 'react-router-dom'
const Layout = ({}) => { return (<div>我是一级路由layout组件<Link to='/about'>点我跳转至About页</Link>   <Link to='/board'>点我跳转至Board页</Link>   {/* {配置子路由,也就是二级路由的出口} */}<Outlet/></div>)
}
export default Layout

然后再创建两个同级的路由:

//Board
const Board=()  => { return (<div>我是面板</div>)
} 
export default Board
//About
const About=()  => { return (<div>我是一级路由About组件</div>)
} 
export default About

然后配置路由和路径:

import Login from "../page/Login";
import Article from "../page/Article";
import { BrowserRouter, createBrowserRouter } from "react-router-dom";
import Layout  from "../page/Layout";
import About from "../page/About";
import Board from "../page/Board";
const router = createBrowserRouter([{path: '/',element: <Layout />,children: [{path: 'board',element: <Board/>},{path: 'about',element:<About/>}], }
])
export default router

默认二级路由

默认二级路由就是设置你默认打开展示的路由,设置路由去掉path,设置index为true

import Login from "../page/Login";
import Article from "../page/Article";
import { BrowserRouter, createBrowserRouter } from "react-router-dom";
import Layout  from "../page/Layout";
import About from "../page/About";
import Board from "../page/Board";
const router = createBrowserRouter([{path: '/',element: <Layout />,children: [//设置默认路由{index:true,element: <Board/>},{path:'about',element:<About/>}], }
])
export default router

对layout设置

import { Link ,Outlet} from 'react-router-dom'
const Layout = ({}) => { return (<div>我是一级路由layout组件<Link to='/about'>点我跳转至About页</Link>   <Link to='/'>点我跳转至Board页</Link>   {/* {配置子路由,也就是二级路由的出口} */}<Outlet/></div>)
}
export default Layout

打开localhost:3000,展示的是二级路由Board

404路由配置

优化用户体验,当浏览器输入的url在整个路由配置中都找不到path,为了用户体验,可以使用404兜底组件进行渲染

编写NotFound路由,创建NotFound文件夹,在里面的index.js编写👇

const NotFound = () => {return <div>页面被老鼠吃掉了</div>
}
export default NotFound 

在路由路径配置处输入【*】,意思是除了已有的路由,之外的任何值都会跳转到404NotFound页面

import Login from "../page/Login";
import Article from "../page/Article";
import { BrowserRouter, createBrowserRouter } from "react-router-dom";
import Layout  from "../page/Layout";
import About from "../page/About";
import Board from "../page/Board";
import NotFound from "../page/NotFound";
const router = createBrowserRouter([{path: '*',element:<NotFound/>}])
export default router

两种路由模式

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

什么是XSS

文章目录 前言1. 前端知识2. 什么是XSS3. 漏洞挖掘4. 参考 前言 之前对XSS的理解就是停留在弹窗&#xff0c;认为XSS这种漏洞真的是漏洞吗&#xff1f;安全学习了蛮久了&#xff0c;也应该对XSS有更进一步的认识了。 1. 前端知识 现代浏览器是一个高度复杂的软件系统&#xf…

字节跳动发布 Trae AI IDE!支持 DeepSeek R1 V3,AI 编程新时代来了!

3 月 3 日&#xff0c;字节跳动重磅发布国内首款 AI 原生集成开发环境&#xff08;AI IDE&#xff09;——Trae 国内版&#xff01; Trae 不只是一个传统的 IDE&#xff0c;它深度融合 AI&#xff0c;搭载 doubao-1.5-pro 大模型&#xff0c;同时支持DeepSeek R1 & V3&…

QT 作业 day4

作业 代码 Widget.h class Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent nullptr);~Widget();private slots:// 槽函数void on_listWidget_itemDoubleClicked(QListWidgetItem *item);private:Ui::Widget *ui; }; #endif Widget.cpp Widget::Widget(QW…

新版 FMEA 七步法 - PFMEA 第2步“结构分析”的关键要点 | FMEA软件

基于AIAG & VDA FMEA七步法&#xff0c;在 PFMEA 第二步“结构分析”中&#xff0c;FMEA软件 CoreFMEA 总结了关键要点如下&#xff1a; 1. 明确分析目的与范围 界定边界&#xff1a;清晰确定要分析的制造系统边界&#xff0c;明确哪些过程、设备、人员等包含在分析范围内…

DeepSeek 助力 Vue3 开发:打造丝滑的时间选择器(Time Picker)

前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏+关注哦 💕 目录 DeepSeek 助力 Vue3 开发:打造丝滑的时间选择器(Time Picker)📚前言📚页面效果📚指令输入…

Python-04BeautifulSoup网络爬虫

2025-03-04-BeautifulSoup网络爬虫 记录BeautifulSoup网络爬虫的核心知识点 文章目录 2025-03-04-BeautifulSoup网络爬虫 [toc]1-参考网址2-学习要点3-核心知识点1. 安装2. 导入必要的库3. 发送 HTTP 请求4. 创建 BeautifulSoup 对象5. 解析 HTML 内容5.1 查找标签5.2 根据属性…

[Windows] 多系统键鼠共享工具 轻松跨系统控制多台电脑

参考原文&#xff1a;[Windows] 多系统键鼠共享工具 轻松跨系统控制多台电脑 还在为多台电脑需要多套键盘鼠标而烦恼吗&#xff1f;是不是在操控 Windows、macOS、Linux 不同系统电脑时手忙脚乱&#xff1f;现在&#xff0c;这些问题通通能解决&#xff01;Deskflow 软件闪亮登…

docker学习笔记(1)从安装docker到使用Portainer部署容器

docker学习笔记第一课 先交代背景 docker宿主机系统&#xff1a;阿里云ubuntu22.04 开发机系统&#xff1a;win11 docker镜像仓库&#xff1a;阿里云&#xff0c;此阿里云与宿主机系统没有关系&#xff0c;是阿里云提供的一个免费的docker仓库 代码托管平台&#xff1a;github&…

Ollama 框架本地部署教程:开源定制,为AI 项目打造专属解决方案!

Ollama 是一款开源的本地大语言模型&#xff08;LLM&#xff09;运行框架&#xff0c;用于管理和运行语言模型。具有以下核心特点&#xff1a; 开源可定制&#xff1a;采用 MIT 开源协议&#xff0c;开发者能自由使用、阅读源码并定制&#xff0c;可根据自身需求进行功能扩展和…

【AIGC】通义万相 2.1 与蓝耘智算:共绘 AIGC 未来绚丽蓝图

一、引言 在人工智能技术迅猛发展的今天&#xff0c;AIGC&#xff08;生成式人工智能内容生成&#xff09;领域正以惊人的速度改变着我们的生活和工作方式。从艺术创作到影视制作&#xff0c;从广告设计到智能客服&#xff0c;AIGC 技术的应用越来越广泛。通义万相 2.1 作为一…

打印三角形及Debug

打印三角形及Debug package struct; ​ public class TestDemo01 {public static void main(String[] args) {//打印三角形 五行 ​for (int i 1; i < 5; i) {for (int j 5 ; j >i; j--) {System.out.print(" ");}for (int k1;k<i;k) {System.out.print(&…

C 语 言 --- 猜 数 字 游 戏

C 语 言 --- 猜 数 字 游 戏 代 码 全 貌 与 功 能 介 绍游 戏 效 果 展 示游 戏 代 码 详 解头 文 件 引 入菜单函数游 戏 逻 辑 函 数 gamerand 函 数 详 解逻 辑 函 数 game 主 函 数 总结 &#x1f4bb;作 者 简 介&#xff1a;曾 与 你 一 样 迷 茫&#xff0c;现 以 经 验…

免费分享一个软件SKUA-GOCAD-2022版本

若有需要&#xff0c;可以下载。 下载地址 通过网盘分享的文件&#xff1a;Paradigm SKUA-GOCAD 22 build 2022.06.20 (x64).rar 链接: https://pan.baidu.com/s/10plenNcMDftzq3V-ClWpBg 提取码: tm3b 安装教程 Paradigm SKUA-GOCAD 2022版本v2022.06.20安装和破解教程-CS…

记录一次Spring事务失效导致的生产问题

一、背景介绍 公司做的是“聚合支付”业务&#xff0c;对接了微信、和包、数字人民币等等多家支付机构&#xff0c;我们提供统一的支付、退款、自动扣款签约、解约等能力给全国的省公司、机构、商户等。 同时&#xff0c;需要做对账功能&#xff0c;即支付机构将对账文件给到…

IntelliJ IDEA集成MarsCode AI

IntelliJ IDEA集成MarsCode AI IDEA中安装插件 安装完毕之后登录自己的账号 点击链接&#xff0c;注册账号 https://www.marscode.cn/events/s/i5DRGqqo/ 可以选择不同的模型

FPGA学习篇——Verilog学习4

1.1 结构语句 结构语句主要是initial语句和always语句&#xff0c;initial 语句它在模块中只执行一次&#xff0c;而always语句则不断重复执行&#xff0c;以下是一个比较好解释的图: (图片来源于知乎博主罗成&#xff0c;画的很好很直观&#xff01;) 1.1.1 initial语句 ini…

并发编程(线程池)面试题及原理

1. 执行原理/核心参数 1.1 核心参数 核心参数 corePoolSize 核心线程数目maximumPooISize 最大线程数目 &#xff08;核心线程&#xff0b;救急线程的最大数目&#xff09;keepAliveTime 生存时间- 救急线程的生存时间&#xff0c;生存时间内没有新任务&#xff0c;此线程资…

Java 大视界 -- Java 大数据在智慧交通信号灯智能控制中的应用(116)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…

1.15-16-17-18迭代器与生成器,函数,数据结构,模块

目录 15&#xff0c;Python3 迭代器与生成器15-1 迭代器15-1-1 基础知识15-1-2 迭代器与for循环工作原理 15-2 生成器&#xff08;本质就是迭代器&#xff09;15-2-1 yield 表达式15-2-2 三元表达式15-2-3 列表生成式15-2-4 其他生成器&#xff08;——没有元祖生成式——&…

如何同步this.goodAllData里面的每一项给到row

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》、《前端求职突破计划》 &#x1f35a; 蓝桥云课签约作者、…