React【Day4】

路由快速上手

1. 什么是前端路由

一个路径 path 对应一个组件 component 当我们在浏览器中访问一个 path 的时候,path 对应的组件会在页面中进行渲染
在这里插入图片描述

2. 创建路由开发环境

# 使用CRA创建项目
npm create-react-app react-router-pro# 安装最新的ReactRouter包
npm i react-router-dom# 启动项目
npm run start

3. 快速开始

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

根目录的index.js

import React from 'react'
import ReactDOM from 'react-dom/client'
import { createBrowserRouter, RouterProvider } from "react";
const router = createBrowserRouter([{path:'/login',element: <div>登录</div>},{path:'/article',element: <div>文章</div>}
])ReactDOM.createRoot(document.getElementById('root')).render(<RouterProvider router={router}/>
)

抽象路由模块

在这里插入图片描述
views/ Article/index.js

const Article = () => {return <div>Article</div>;
};export default Article;

router/ index.js

import Login from "../views/Login/index";
import Article from "../views/Article/index";import { createBrowserRouter, RouterProvider } from "react-router-dom";const router = createBrowserRouter([{path: "/login",// element: Login,  // 这样写不对!!!!!element: <Login />,},{path: "/Article",element: <Article />,},
]);export default router;

index.js

import React from "react";
import ReactDOM from "react-dom/client";
import App from "./App";
import { createBrowserRouter, RouterProvider } from "react-router-dom";import router from "./router/index";const root = ReactDOM.createRoot(document.getElementById("root"));root.render(<RouterProvider router={router}></RouterProvider>);

路由导航

1. 什么是路由导航

路由系统中的多个路由之间需要进行路由跳转,并且在跳转的同时有可能需要传递参数进行通信
在这里插入图片描述

2. 声明式导航

声明式导航是指通过在模版中通过 <Link/> 组件描述出要跳转到哪里去,比如后台管理系统的左侧菜单通常使用这种方式进行

在这里插入图片描述

import { Link, useNavigate } from "react-router-dom";import { Link, useNavigate } from "react-router-dom";
const Login = () => {const navigate = useNavigate();return (<div>login{/* <link to="/article">跳转到文章</link>  不是这个link */}{/* 这样写才对 */}<Link to="/article/slx/js">跳转到文章</Link></div>);
};export default Login;

语法说明:通过给组件的to属性指定要跳转到路由path,组件会被渲染为浏览器支持的<a href="xxxxx">,如果需要传参直接通过字符串拼接的方式拼接参数即可。

3. 编程式导航

编程式导航是指通过 useNavigate 钩子得到导航方法,然后通过调用方法以命令式的形式进行路由跳转,比如想在登录请求完毕之后跳转就可以选择这种方式,更加灵活

在这里插入图片描述

语法说明:通过调用navigate方法传入地址path实现跳转

导航传参

在这里插入图片描述

1. searchParams传参 ( ?name=slx

Login.js

import { useNavigate } from "react-router-dom";
const Login = () => {const navigate = useNavigate();return (<div>login{/* 声明式导航 */}{/* <link to="/article">跳转到文章</link> */}{/* 命令式导航 */}<buttononClick={() => {navigate("/article?name=slx&code=js");}}>跳转到文章{" "}</button></div>);
};export default Login;

Article.js

import { useSearchParams } from "react-router-dom";
const Article = () => {// 从数据中解构paramsconst [params] = useSearchParams();const name = params.get("name");console.log("name", name);const code = params.get("code");console.log("code", code);return <div>Article</div>;
};export default Article;

params传参 ( /slx + 路由配置

在这里插入图片描述

多种参数情况:

Login.js

import { useNavigate } from "react-router-dom";
const Login = () => {const navigate = useNavigate();return (<div>login<buttononClick={() => {navigate("/article/slx/js");}}>跳转到文章{" "}</button></div>);
};export default Login;

Article.js

import { useSearchParams, useParams } from "react-router-dom";
const Article = () => {// 从数据中解构paramsconst params = useParams();const name = params.name;console.log("name", name);const code = params.code;console.log("code", code);
};export default Article;

router / index.js

 {path: "/Article/:name/:code",element: <Article />,},

嵌套路由配置

1. 什么是嵌套路由

在一级路由中又内嵌了其他路由,这种关系就叫做嵌套路由,嵌套至一级路由内的路由又称作二级路由,例如:
在这里插入图片描述

2. 嵌套路由配置

实现步骤

  1. 使用 children属性配置路由嵌套关系
  2. 使用 <Outlet/> 组件配置二级路由渲染位置

在这里插入图片描述
router.js

import Login from "../views/Login/index";
import Article from "../views/Article/index";
import Layout from "../views/Layout/index";
import Board from "../views/Board/index";
import About from "../views/About/index";import { createBrowserRouter, RouterProvider } from "react-router-dom";const router = createBrowserRouter([{path: "/children",element: <Layout />,children: [{// path: "/board", //报错!!  绝对路径 "/board" 被嵌套在路径 "/children" 下面,这是不合法的,// 绝对子路径必须从其所有父路由的组合路径开始。// path: "/children/board", // 都写成绝对路径,可以path: "board", // 改为相对于 "/children" 的路径,可以element: <Board />,},{path: "/children/about",element: <About />,},],},{path: "/login",// element: Login,  // 这样写不对!!!!!element: <Login />,},{path: "/article/:name/:code",element: <Article />,},
]);export default router;

Layout / index.js

import { Outlet, Link } from "react-router-dom";const Layout = () => {return (<div>一级路由Layout{/* <Link to="children/about">关于</Link> 这样写不对,地址变成这个啦: http://localhost:3000/children/children/about */}<Link to="/children/about">关于</Link><Link to="/children/board">面板</Link><Outlet></Outlet></div>);
};
export default Layout;

3. 默认二级路由

当访问的是一级路由时,默认的二级路由组件可以得到渲染,只需要在二级路由的位置去掉path,设置index属性为true

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

4. 404路由配置

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

实现步骤:

  1. 准备一个NotFound组件
  2. 在路由表数组的末尾,以*号作为路由path配置路由

在这里插入图片描述

5. 俩种路由模式

各个主流框架的路由常用的路由模式有俩种,history模式和hash模式, ReactRouter分别由 createBrowerRouter 和 createHashRouter 函数负责创建

路由模式url表现底层原理是否需要后端支持
historyurl/loginhistory对象 + pushState事件需要
hashurl/#/login监听hashChange事件不需要

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

【6】mysql查询性能优化-关联子查询

【README】 0. 先说结论&#xff1a;一般用inner join来改写in和exist&#xff0c;用left join来改写not in&#xff0c;not exist&#xff1b;&#xff08;本文会比较内连接&#xff0c;包含in子句的子查询&#xff0c;exist的性能 &#xff09; 1. 本文总结自高性能mysql 6…

Spark-机器学习(3)回归学习之线性回归

在之前的文章中&#xff0c;我们了解我们的机器学习&#xff0c;了解我们spark机器学习中的特征提取和我们的tf-idf&#xff0c;word2vec算法。想了解的朋友可以查看这篇文章。同时&#xff0c;希望我的文章能帮助到你&#xff0c;如果觉得我的文章写的不错&#xff0c;请留下你…

异常检测 | SVDD支持向量数据描述异常数据检测(Matlab)

异常检测 | SVDD支持向量数据描述异常数据检测&#xff08;Matlab&#xff09; 目录 异常检测 | SVDD支持向量数据描述异常数据检测&#xff08;Matlab&#xff09;效果一览基本介绍程序设计参考资料 效果一览 基本介绍 用于一类或二元分类的 SVDD 模型 多种核函数&#xff08;…

栈与堆的比较

栈与堆的比较 栈与堆的比较申请后系统的响应申请效率的比较申请大小的限制堆和栈中的存储内容总结参考 栈与堆的比较 内存布局&#xff1a; 申请后系统的响应 栈&#xff1a;只要栈的剩余空间大于所申请空间&#xff0c;系统将为程序提供内存&#xff0c;否则将报异 常提示…

InnoDB架构:磁盘篇

InnoDB架构&#xff1a;磁盘篇 InnoDB是MySQL数据库中默认的存储引擎&#xff0c;它为数据库提供了事务安全型&#xff08;ACID兼容&#xff09;、行级锁定和外键支持等功能。InnoDB的架构设计优化了对于读取密集和写入密集型应用的性能表现&#xff0c;是一个高度优化的存储系…

【经典小游戏】猜数字

前言1. 游戏介绍2. 游戏实现3. 游戏优化结语 个人主页&#xff1a;C_GUIQU 前言 各位小伙伴大家好&#xff01; 先问大家一个问题&#xff1a;我们为什么要学习&#xff1f; 简单来说&#xff0c;就是为了实践&#xff01;只有不断学习才可以帮助我们更好地实践&#xff01; 小…

驱动开发-windows驱动设计目标

驱动程序和应用程序不一样的&#xff0c;由于其直接运行于windows r0级&#xff0c;故对于开发有更多和更严格的标准&#xff0c;一般会有以下一些常见的设计目标: 安全性、可移植性、可配置性、 可被中断、多处理器安全、可重用 IRP、 支持异步 I/O这些是基本目标。 1. 安全…

稀碎从零算法笔记Day53-LeetCode:不同路径 II

稀碎系列有点更不动(更多是自己懈怠了) 题型&#xff1a;矩阵、模拟 链接&#xff1a;63. 不同路径 II - 力扣&#xff08;LeetCode&#xff09; 来源&#xff1a;LeetCode 题目描述 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &…

C++ 深入理解 继承

本篇文章将谈谈一下几个问题&#xff1a; 1.基类和派生类对象赋值转换 2.继承中的作用域 3.派生类的默认成员函数 4.复杂的菱形继承及菱形虚拟继承 5.其他 1.基类和派生类对象赋值转换 1.派生类对象 可以赋值给 基类的对象 / 基类的指针 / 基类的引用。这里有个形象的说法叫切…

VSCode 目录折叠展开、缩进深度设置

1、VSCode 目录折叠展开设置 运行 Visual Studio Code &#xff0c;按 Ctrl &#xff0c;打开设置 输入Explorer:Compact Folders&#xff0c;取消勾选 或者在设置文件上添加 "explorer.compactFolders": false2、VSCode 目录缩进深度设置 输入Workbench Tree:…

STM32学习和实践笔记(18):STM32的外部中断的配置

如上图&#xff0c;EXTI的0-15是分配给GPIO的16个引脚。 但是GPIO差不多每个端口都有16个引脚&#xff0c;具体是怎样分配的呢&#xff1f; 很简单&#xff0c;就是通过AFIO寄存器来选择和分配。 比如&#xff0c;EXTI0&#xff0c;可以分配给GPIOA0&#xff0c;GPIOB0...GP…

Windows COM技术:COM介绍、代码演示。

目录 步骤一&#xff1a;理解COM技术 介绍COM的基础知识 1. COM的目的和特点 2. COM的关键概念 3. COM的实现 4. COM与DCOM、ActiveX 讨论COM的用途 1. 软件自动化 2. 插件和扩展 3. 跨语言开发 4. 分布式计算 5. 系统级组件 6. 网络浏览器插件 步骤二&#xff1a…