ReactRouter——路由配置、路由跳转、带参跳转、新route配置项

news2024/12/23 16:44:19

目录

写在前面

(一)初步使用router

1.安装react-router-dom

2.创建router结构 

3.嵌套路由

4.配置not found页面

(1)确切路由报错页面

(2)未配置路由报错页面

5.重定向

(二)路由跳转

1.组件跳转

3.js跳转 

(三)传递参数

1.searchParams(query)参数

2.params参数

(四)新增route配置项

1.loader

2.action

3.lazy

(六)总结


写在前面

目前准备先学习react-router 6的版本,后续旧版本的可能会另外记录

(一)初步使用router

Home v6.23.1 | React Router

1.安装react-router-dom

npm i react-router-dom

2.创建router结构 

直接来看代码!  

路由可以选择多种类型:

createBrowserRouter:history路由(推荐)

createHashRouter:哈希路由(不推荐)

createMemoryRouter:有自己的一套路由记忆栈,用于生产开发工具、无浏览器环境使用

createStaticRouter:用于服务器

Picking a Router v6.23.1 | React Router

// src/router/index.jsx
import { createBrowserRouter } from "react-router-dom";
import Home from "../views/Home";
import Login from "../views/Login";

const router = createBrowserRouter([
    {
        path:'/',
        element: <Home />,
    },
    {
        path:'/login',
        element: <Login />,
    }
])

export default router

这个文件后缀必须是jsx,js解析不了组件 

首先能看到开始使用方法来搭建router,而不是使用<BrowserRouter />这种组件式创建路由

createBrowserRouter这种称之为 data API,是6.4版本的新型api,虽然目前react native不支持,但很快就会支持这种写法。 

静态组件:

创建components文件夹存放静态组件,基本操作了 

路由组件:

创建views文件夹存放路由组件 

// src/views/Home.jsx
export default function Home(){
    return (
        <>
            <div className="main">
                <h1>这里是home页</h1>
            </div>
        </>
    )
}

将router挂载到app.jsx(直接挂载到main.jsx也ok的)

使用RouterProvider组件将路由组件放到header和footer组件之间,再将刚刚配置的router传入router项

有点意思嗷,这不就是vue的router-view??不过目前还不确定具体有什么相似之处

import { RouterProvider } from "react-router-dom"
import router from "./router"
import Header from "./components/Header"
import Footer from "./components/Footer"
import './app.css'

function App() {
  return (
    <>
      <div className="app">
        <Header></Header>
        <RouterProvider router={router} />
        <Footer></Footer>
      </div>
    </>
  )
}

export default App

3.嵌套路由

在有路由子组件的路由父组件上放一个<Outlet />组件占位

// home.jsx
import { Outlet } from "react-router-dom"
<div className="main">
    <h1>这里是home页</h1>
    <div className="layout"></div>
    <div className="content">
        <Outlet />
    </div>
</div>

再在router结构中配置子路由:

// router/index.jsx
    {
        path:'/home',
        element: <Home />,
        errorElement:<ErrorPage />,
        children: [
            {
                path: "content",
                element: <Content />,
            },
        ],
    },

 欧了,能显示子路由了!这个Outlet的功能跟vue的router-view肯定就是一模一样了

4.配置not found页面

先编写一个通用的errorPage页面

useRouteError hook会获取到该路由报错信息 

import { useRouteError } from "react-router-dom"

export default function ErrorPage(){
    const routerError = useRouteError()
    return (
        <>
            <div className="main">
                <h1>this page is not found!</h1>
                <p>{routerError}</p>
            </div>
        </>
    )
}

(1)确切路由报错页面

errorElement v6.23.1 | React Router

当loader、actions配置项或者组件渲染抛出错误时,会展示errorPage页面 

const router = createBrowserRouter([
    {
        path:'/',
        element: <Home />,
        errorElement:<ErrorPage />
    },
    {
        path:'/login',
        element: <Login />,
        errorElement: <ErrorPage />
    },
])

还没学到loader、action,要晚点才能展示这个的作用了 

(2)未配置路由报错页面

和router以前版本一样 路径写成通配符 

const router = createBrowserRouter([
    {
        path:'/',
        element: <Home />,
        errorElement:<ErrorPage />
    },
    {
        path:'/login',
        element: <Login />,
        errorElement: <ErrorPage />
    },
    {
        path:'*', // 通配符 代表除上面提到的路径,其他都会直接显示errorPage页面
        element:<ErrorPage />
    }
])

5.重定向

Navigate v6.23.1 | React Router

使用Navigate组件实现路由重定向

to:前往路由  replace:是否替换历史堆栈中的当前条目

<Navigate to="/xxx" replace={true} /> 

既可以在组件处重定向,也可以在router结构里重定向

const router = createBrowserRouter([
    {
        path:'/',
        element: <Navigate to="/home" replace />,
        errorElement:<ErrorPage />,
    },
    {
        path:'/home',
        element: <Home />,
        errorElement:<ErrorPage />,
        children: [
            {
                path: "content",
                element: <Content />,
            },
        ],
    },

这样网页打开时/路径就直接跳转到/home路由了

(二)路由跳转

1.组件跳转

Link v6.23.1 | React Router

用法和vue的router-link差不多,哎哟这小味上来了

要注意的是:to的路径写成content是跳转到/home/content,写成/content会直接跳转到/content路径! 

// home.jsx
<div className="main home">
    <div className="layout">
        <h3>这里是home页</h3>
        <Link to="content">content</Link>
        <Link to="content2">content2</Link>
    </div>
    <div className="content">
        <Outlet />
    </div>
</div>

 

NavLink v6.23.1 | React Router

使用navlink跳转和link的操作都一致,唯一不同的是,使用navlink跳转到目标路由后,该a标签会新增一个active类

因此,可以用于列表栏展示活跃标签的功能,将active的a标签颜色改为红色

<NavLink to="content">content</NavLink>
<NavLink to="content2">content2</NavLink>

.active{
    color: red;
}

当需要active的样式太多, 可以改变a标签活跃的类名

<NavLink to="content" className={
    ({ isActive }) => (isActive ? 'nav-active' : '')
}>content</NavLink>
<NavLink to="content2" className={
    ({ isActive }) => (isActive ? 'nav-active' : '')
}>content2</NavLink>

.nav-active{
    color: red;
}

或者是直接修改样式

<NavLink to="content" style={
    ({ isActive }) => ({ color: isActive ? 'red' : '' })
}>content</NavLink>
<NavLink to="content2" style={
    ({ isActive }) => ({ color: isActive ? 'red' : '' })
}>content2</NavLink>

style和className属性都需要传递一个回调函数,取得的形参就是react提供的数据,更多数据直接看文档吧,毕竟这个组件不常用

3.js跳转 

useNavigate v6.23.1 | React Router

使用useNavigate hook跳转, 第一个参数:路径,第二个参数:路由选项,剩余选项直接看文档

import { useNavigate } from "react-router-dom"
export default function Home() {
    const navigate = useNavigate()
    const goLogin = () => {
        // 代码跳转路由
        navigate('/login', { replace: false })
    }
    return (
        <>
            <div className="main home">
                <div className="layout">
                    <h3>这里是home页</h3>
                    <button onClick={goLogin} >登录</button>
                    ...
        </>
    )

(三)传递参数

1.searchParams(query)参数

useSearchParams v6.23.1 | React Router

通过路径传参

// home.jsx
const navigate = useNavigate()
const goLogin = () => {
        // 代码跳转路由
        navigate('/login?name=csq&age=100', { replace: false })
    }

通过useSearchParams hook接收

import { useSearchParams } from "react-router-dom"
export default function Login(){
    const [searchParams, setSearchParams] = useSearchParams()
    const name = searchParams.get('name')
    const age = searchParams.get('age')
    return (
        <>
            <div className="main">
                <h1>这里是Login页</h1>
                <p>name:{name}</p>
                <p>age:{age}</p>
            </div>
        </>
    )
}

 这个hook除了获取query参数外,结构还蛮丰富的,甚至还能setSearchParams。。

就是不太清楚具体用处,后面遇到了就补

2.params参数

这种直接用斜杠分隔路径和数据

// home.jsx
    const navigate = useNavigate()
    const goLogin = () => {
        // params传参
        navigate('/login/csq/100')
    }

在router结构里先声明

表示params参数, 表示可选 

    {
        path:'/login/:name/:age?',
        element: <Login />,
        errorElement: <ErrorPage />
    },

在login组件获取传递来的参数

使用useParams hook获取传递来的params参数,这种方式拿参数比较方便,直接解构就能拿,上一个要一个一个get,有点麻烦 ;不过上一种不需要配置router,蛮难选哈QAQ

import { useParams } from "react-router-dom";
export default function Login(){
    const {name, age} = useParams()
    return (
        <>
            <div className="main">
                <h1>这里是Login页</h1>
                <p>name:{name}</p>
                <p>age:{age}</p>
            </div>
        </>
    )
}

(四)新增route配置项

1.loader

loader v6.23.1 | React Router  

在路由组件渲染前使用loader获取数据

可以进行异步操作,如果抛出错误会被useRouteError获取到 

只有data api可以使用该配置 

// router/index.jsx
import Content, { loader as contentLoader } from "../views/Content";
{
    path: "content",
    element: <Content />, 
    errorElement: <ErrorPage />,
    loader: contentLoader,
},

用promise模拟请求失败的情况,在1s后抛出错误,页面被更改为errorpage页面

// content.jsx
// 用于请求
export const loader = async () => {
    // 模拟请求失败
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            reject('请求失败!')
        }, 1000)
    }).then(res => {
        console.log(res);
    }).catch(err => {
        throw (err)
    })
}

export default function Content() {
    
    return (
        <>
            <h1>这里是Content页!!</h1>
        </>
    )
}

 

2.action

action v6.23.1 | React Router

Route actions are the "writes" to route loader "reads". They provide a way for apps to perform data mutations with simple HTML and HTTP semantics while React Router abstracts away the complexity of asynchronous UI and revalidation. This gives you the simple mental model of HTML + HTTP (where the browser handles the asynchrony and revalidation) with the behavior and UX capabilities of modern SPAs.  

路由操作是对路由加载程序“读取”的“写入”。它们为应用程序提供了一种通过简单的HTML和HTTP语义执行数据突变的方法,而React Router则抽象掉了异步UI和重新验证的复杂性。这为您提供了HTML+HTTP的简单心理模型(其中浏览器处理异步和重新验证)以及现代SPAs的行为和用户体验功能。

。。。说实话有点理解不到,也没理解到和loader的关系。。先都放在这里 后续来补充

3.lazy

lazy v6.23.1 | React Router

照着文档写的懒加载怎么没有用。。

后面再来看看吧 累了 哎

(五)路由守卫

(六)总结

终于学到router了!

今天主要是根据文档学的6.4相关的router,和现在常用的应该还是有点出入,肯定多看看就完事儿了!

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

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

相关文章

OS复习笔记ch8-3

驻留集 驻留集&#xff1a;指请求分页存储管理中给进程分配的内存块的集合。 在采用了虚拟存储技术的系统中&#xff0c;驻留集大小一般小于进程的总大小。 驻留集&#xff0c;从某种角度可以看成是进程可以常驻内存的内存块的集合。 若驻留集太小&#xff0c;会导致缺页频繁…

Golang | Leetcode Golang题解之第132题分割回文串II

题目&#xff1a; 题解&#xff1a; func minCut(s string) int {n : len(s)g : make([][]bool, n)for i : range g {g[i] make([]bool, n)for j : range g[i] {g[i][j] true}}for i : n - 1; i > 0; i-- {for j : i 1; j < n; j {g[i][j] s[i] s[j] && g[…

CentOS7 配置Nginx域名HTTPS

Configuring Nginx with HTTPS on CentOS 7 involves similar steps to the ones for Ubuntu, but with some variations in package management and service control. Here’s a step-by-step guide for CentOS 7: Prerequisites Domain Name: “www.xxx.com”Nginx Install…

阿里云平台产品创建过程 网页端界面 手机APP

云平台产品创建 登录后选择 产品-物联网-物联网平台&#xff1a; 进入后选择 公共示例-立即试用&#xff1a; 选择 公共示例&#xff1a; 选择 设备管理-产品-创建产品&#xff1a; 产品名称: 传感器 所属品类&#xff1a;自定义品类 节点类型&#xff1a;直连设备 联网方式…

mysql-community-libs-5.7.44-1.el7.x86_64.rpm 的公钥尚未安装

在 CentOS 或 RHEL 系统上安装 RPM 包时&#xff0c;如果遇到“公钥尚未安装”的问题&#xff0c;通常是因为系统没有导入相应的 GPG 公钥。MySQL 官方提供了一个 GPG 公钥&#xff0c;用于验证 RPM 包的签名。 以下是解决该问题的步骤&#xff1a; 下载并导入 MySQL 官方的 GP…

Linux本地搭建DataEase并发布公网远程访问进行数据分析

文章目录 前言1. 安装DataEase2. 本地访问测试3. 安装 cpolar内网穿透软件4. 配置DataEase公网访问地址5. 公网远程访问Data Ease6. 固定Data Ease公网地址 前言 DataEase 是开源的数据可视化分析工具&#xff0c;帮助用户快速分析数据并洞察业务趋势&#xff0c;从而实现业务…

目标检测数据集 - 垃圾桶满溢检测数据集下载「包含VOC、COCO、YOLO三种格式」

数据集介绍&#xff1a;垃圾桶满溢检测数据集&#xff0c;真实场景高质量图片数据&#xff0c;涉及场景丰富&#xff0c;比如城市道边垃圾桶满溢、小区垃圾桶满溢、社区垃圾桶满溢、农村道边垃圾桶满溢、垃圾集中处理点垃圾桶满溢、公园垃圾桶满溢数据等。数据集标注标签划分为…

Luminar Neo - AI智能修图软件超越PS和LR,简单易用又高效!

很多人都想美化自己的风景和人物的图片&#xff0c;得到更加美丽耀眼的效果。然而&#xff0c;专业摄影师和设计师在电脑上使用的后期工具如 Photoshop 和 LightRoom 过于复杂。 通常为了一些简单的效果&#xff0c;你必须学习许多教程。而一些针对小白用户的“一键式美颜/美化…

度小满金融大模型的应用创新

XuanYuan/README.md at main Duxiaoman-DI/XuanYuan GitHub

晶振十大品牌

晶振是电路的心脏&#xff0c;特别对抖动、稳定度有要求&#xff0c;当然除了稳定度&#xff0c;抖动&#xff0c;还对环境温度有要求&#xff0c;优秀的厂商如下&#xff1a; 链接&#xff1a; 晶振十大品牌-晶振品牌-振荡器品牌-Maigoo品牌榜

大话设计模式解读01-简单工厂模式

本系列的文章&#xff0c;来介绍编程中的设计模式&#xff0c;介绍的内容主要为《大话设计模式》的读书笔记&#xff0c;并改用C语言来实现&#xff08;书中使用的是.NET中的C#&#xff09;,本篇来学习第一章&#xff0c;介绍的设计模式是——简单工厂模式。 1 面向对象编程 …

华为防火墙配置 SSL VPN

前言 哈喽&#xff0c;我是ICT大龙。本期给大家更新一次使用华为防火墙实现SSL VPN的技术文章。 本次实验只需要用到两个软件&#xff0c;分别是ENSP和VMware&#xff0c;本次实验中的所有文件都可以在文章的末尾获取。话不多说&#xff0c;教程开始。 什么是VPN 百度百科解…

Pycharm中import torch报错解决方案(Python+Pycharm+Pytorch cpu版)

pycharm环境搭建完毕后&#xff0c;编写一个py文件demo&#xff0c;import torch报错&#xff0c;提示没有。设置python解释器&#xff1a; 选择conda环境&#xff0c;使用现有环境&#xff0c;conda执行文件找到Anaconda安装路径下Scripts文件夹内的conda.exe&#xff0c;最后…

十大人工智能企业

​​​​​​链接&#xff1a;​​​​​​人工智能品牌排行-人工智能十大公司-人工智能十大品牌-Maigoo品牌榜

发光二极管十大品牌

日常电路设计中&#xff0c;LED是必用的元器件之一&#xff0c;辅助判定电路异常。 十大发光二极管品牌-LED灯珠生产厂家哪家好-LED发光二极管厂家前十-Maigoo品牌榜

MinIO 分布式文件系统 快速入门 这篇就够了

1.MinIO简介 MinIO 是一个开源的对象存储服务&#xff0c;它提供了一个可扩展的分布式文件系统&#xff0c;用于存储和检索任意类型的数据。MinIO 旨在为云原生应用程序提供快速、可靠和成本效益高的存储服务&#xff0c;并支持多种数据格式和协议&#xff0c;如Amazon S3 API。…

深度学习简单概述

概述 理论上来说&#xff0c;参数越多的模型复杂度越高、容量越大&#xff0c;这意味着它能完成更复杂的学习任务。但复杂模型的训练效率低&#xff0c;易陷入过拟合。随着云计算、大数据时代的到来&#xff0c;计算能力的大幅提高可以缓解训练的低效性&#xff0c;训练数据的…

音视频转为文字SuperVoiceToText

音视频转为文字SuperVoiceToText&#xff0c;它能够把视频或语音文件高效地转换为文字&#xff0c;它是基于最为先进的 AI 大模型&#xff0c;通过在海量语音资料上进行训练学习而造就&#xff0c;具备极为卓越的识别准确率。 不仅如此&#xff0c;它支持包括汉语、英语、日语…

springboot 3 oauth2认证this.authorizationService.save(authorization)生成token报错异常

springboot 3 oauth2认证this.authorizationService.save(authorization)生成token报错异常&#xff0c;使用springboot版本3.3.0。 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId>&…

高考志愿填报:大学学什么专业比较好呢?

准高三一枚&#xff0c;比较迷茫&#xff0c;求推荐一些专业以后比较好就业&#xff0c;发展前景较好的。听说互联网行业比较吃香&#xff0c;有想过以后做运营这一块&#xff0c;但是不知道应该在大学选什么专业&#xff0c;求推荐吧&#xff01; 学什么专业好&#xff1f; 这…