04-react基础知识-路由

一、react路由环境安装

使用指令:npm i --save react-router-dom @type/react-router-dom进行react路由环境安装

二、引入路由

在main.jsx文件中引入该语句:

import { createBrowserRouter, RouterProvider } from 'react-router-dom'

定义一个变量router来接收createBrowserRouter(【】)”【】“里面是每个路由 的path(路径),当访问的是path里的路径时,则访问element的组件。

// 使用高阶组件,若要进行页面之间的跳转,必须使用suspense标签将其组件括起来,不然的话会报错嘞!!!

1.最简单的写法

 let router = createBrowserRouter([
  {
//页面访问的路径
    path: '/home',
//访问path路径时,页面显示element里的组件
    element: <div>首页页面</div>
  },
   {
     path: '/user',
     element: <div>用户页面</div>
   },
   {
     path: '/login',
     element: <div>登录呀呀呀</div>
   },

 ])

2.进阶版一:访问相应的path页面,若要跳转到自己封装的组件

需要使用到高阶组件

如代码中load返回的是一个<com/>组件,然后element中使用该高阶组件进行懒加载,引入要访问的组件路径。即可

3.最终版,也是代码比较少的一种写法

import ReactDOM from 'react-dom/client'
import { createBrowserRouter, RouterProvider } from 'react-router-dom'
// 将path传进去
let load = (path) => {
  // 使用高阶组件,若要进行页面之间的跳转,必须使用suspense标签将其组件括起来,不然的话会报错嘞!!!
  let Comp = React.lazy(() => import(path))
  return (<React.Suspense>
    <Comp></Comp>
  </React.Suspense>)
}
let router = createBrowserRouter([
  {
    path: '/home',
    element: load('./component/01-son.jsx')
  },
  {
    path: '/granson',
    element: load('./component/hook/02-granSon')
  }

])
ReactDOM.createRoot(document.getElementById('root')).render(
  // 在根组件中使用RouterProvider来提供路由功能
  <RouterProvider router={router}></RouterProvider>
)

三、页面之间跳转(无参跳转)

1.1Link标签和a标签的区别?

两者都可以链接到网络地址,

前者:当链接到当前项目中的路由的地址的话,不会刷新当前的网址,只是刷新当前的组件

后者:链接到当前项目中的路由的地址的话,刷新的话当前网址会重新加载,页面重新刷新

1.利用link标签进行跳转

//son页面

import React, { useState } from 'react'
import { Link } from 'react-router-dom'
function Son() {
    return (
        <div>
            <h2>son页面</h2>
            {/* 使用link进行专拣之间的跳转:减少了页面刷新的次数 */}
            <Link to='/granson'>跳转到granson页面</Link><br />

        //link标签跳转的第二种写法:to里面是两个花括号*****************************
            <Link to={{ pathname: '/granson' }}>跳转</Link><br />


            {/* a标签也可以实现页面跳转,但页面每次刷新,都会重新加载页面 */}
            <a href="/granson">a标签跳转</a><br />
            <Link to='http://www.baidu.com'>link链接到百度地址</Link><br />
            <a href="'http://www.baidu.com">a链接到百度地址</a>
        </div>
    )

}
export default Son


//granson页面



import React, { useContext } from 'react'
function Grandson() {
    return (
        <div>
            <h5>Grandson页面</h5>

        </div>
    )
}
export default Grandson

2.用编程式写法进行页面之间的跳转

代码中有编程式写法进行页面跳转的两种方式

import React, { useState } from 'react'
import { useNavigate } from 'react-router-dom'
function Son() {
    // 定义一个变量来接收刚刚引进来的函数
    let router = useNavigate()
    // 点击按钮router就去匹配相对应的组件进行跳转
    // 编程式写法的第一种写法=====================================
    function tiaozhuan() {
        router('/granson')
    }
    // 编程式写法的第二种写法======================================
    function tiao() {
        router({ pathname: "/granson" })
    }
    return (
        <div>
            <h2>son页面</h2>
            <button onClick={tiaozhuan}>点击跳转到granson页面</button><br /><br />
            <button onClick={tiao}>点击跳转到granson页面</button>
        </div>
    )

}
export default Son

四、页面之间跳转(有参跳转)

        1.state传参(常用)

使用编程式写法来进行传参:1.引入useNavitage函数

                                                2.给定一个假的数据obj

                                                3.定义一个变量来接收刚刚引入的useNavitage

                                                4.useNavitage的两个参数:(1:要跳转的页面路径

                                                                                               (2:state是要传递的数据

                                跳转后的页面若要使用从前面传递过来的数据,则需要引入useLocation

                                                5.用一个变量来接收引入的useLocation函数

                                                7.在控制台打印,即可在state里面找到从前面传递过来的数据,并且可以在该页面正常使用。

//son组件中====================================================================


import React, { useState } from 'react'
import { useNavigate } from 'react-router-dom'
function Son() {
    let [obj, setobj] = useState([{ id: 1, name: "衣服", price: "125元", comment: "质量挺好好哈" },
    { id: 2, name: "裤子", price: "133元", comment: "真棒呀!!" },
    { id: 3, name: "鞋子", price: "232元", comment: "不错哦" }])
    let navigate = useNavigate()
    console.log(obj);
    function change(id) {
        console.log(id);



        // 使用navigate实现页面跳转,state来进行传递参数,这里是将id传递过去
        navigate({ pathname: "/granson" }, { state: { id } })
    }
    return (
        <div>
            <h2>son页面</h2>
            <div>{obj.map(el => <div key={el.id}>
                <div>{el.name}</div>
                <div>{el.price}</div>
                <div>{el.comment}</div>
                {/* 点击button传递相应的参数id传递给change函数 */}
                <button onClick={() => { change(el.id) }}>点击跳转到granson页面</button>

            </div>)}
            </div>
        </div>
    )

}
export default Son

//granson组件中

import React, { useContext } from 'react'
// 1.1在组件页面需要引入uselocation
import { useLocation } from 'react-router-dom'
function Grandson() {
    //1.2: 用一个变量来接收uselocation函数
    let obj = useLocation()
    // 在控制台的state中可以看到从son组件中传递过来的id和obj数据
    console.log(obj);
    return (
        <div>
            <h5>Grandson页面</h5>
            <div>{obj.state.id}</div>
            {/* 在granson页面可以正常使用 */}
            <div>{obj.state.obj[0].name}</div>

        </div>
    )
}
export default Grandson





        2.query传参

                1.引入useNavitage

                2.定义一个变量来接收刚刚引入的useNavitage                

                3.useNavitage的两个参数:(1:要跳转的页面路径

                                                             (2:search是要传递的数据

                 跳转后的页面若要查看从前面传递过来的数据,则需要引入useLocation

                4.用一个变量来接收引入的useLocation函数

                7.在控制台打印,即可在search里面看到到从前面传递过来的数据,但不能直接取出来使用,需要自己去处理后才能正常使用

/son组件中===============================================================================

import React, { useState } from 'react'
import { useNavigate } from 'react-router-dom'
function Son() {
    let [obj, setobj] = useState([{ id: 1, name: "衣服", price: "125元", comment: "质量挺好好哈" },
    { id: 2, name: "裤子", price: "133元", comment: "真棒呀!!" },
    { id: 3, name: "鞋子", price: "232元", comment: "不错哦" }])
    let navigate = useNavigate()
    console.log(obj);
    function change(id) {
        console.log(id);
        // 使用navigate实现页面跳转,search来进行传递参数
        navigate({ pathname: "/granson", search: "id=32&name='衣服'" })
    }
    return (
        <div>
            <h2>son页面</h2>
            <div>{obj.map(el => <div key={el.id}>
                <div>{el.name}</div>
                <div>{el.price}</div>
                <div>{el.comment}</div>
                {/* 点击button传递相应的参数id传递给change函数 */}
                <button onClick={() => { change(el.id) }}>点击跳转到granson页面</button>

            </div>)}
            </div>
        </div>
    )

}
export default Son









//granson组件中=====================================================================

import React, { useContext } from 'react'
// 1.1在组件页面需要引入uselocation
import { useLocation } from 'react-router-dom'
function Grandson() {
    //1.2: 用一个变量来接收uselocation函数
    let obj = useLocation()
    // 在控制台的state中的search可以看到传递过来的数据,但不能直接使用,需要自己进一步处理后再使用
    console.log(obj);
    return (
        <div>
            <h5>Grandson页面</h5>


        </div>
    )
}
export default Grandson

state和query传参两者的区别:前者是传递过去了那边直接可以使用,后者是传递过去的数据需要自己进一步处理后才能使用。

        3.动态路由传参

granson路由部分=========================================================
 {
    path: '/granson/:dt',
    element: load('./component/hook/02-granSon')
  }

//son组件部分=======================================================================

import React, { useState } from 'react'
import { useNavigate } from 'react-router-dom'
function Son() {
    let navigate = useNavigate()
    function change() {
        // 在后面的控制台中的pathname中可以看到/granson/2023这个数据
        navigate({ pathname: "/granson/2023" })
    }
    return (
        <div>
            <h2>son页面</h2>
            <button onClick={change}>点击跳转到granson页面</button>
        </div>
    )
}
export default Son


//granson组件组分==========================================================================
import React, { useContext } from 'react'
// 1.1在组件页面需要引入uselocation
import { useLocation } from 'react-router-dom'
function Grandson() {
    //1.2: 用一个变量来接收uselocation函数
    let obj = useLocation()
    console.log(obj);
    return (
        <div>
            <h5>Grandson页面</h5>
        </div>
    )
}
export default Grandson

57行中传递了一个参数。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

借助 DevChat AI 之力,成就我之全栈梦想

何为 DevChat &#xff1f; DevChat 是集好多种 AI 大模型的智能编程工具,可以大大增加我们上班摸鱼的时间。 整合了如 ChatGPT、Codex等热门 AI 模型支持自然语言编程、代码生成与编写、代码补全等功能因其集成热门 AI 智能&#xff0c;相当于站在了巨人的肩膀上&#xff0c…

节省服务器资源、实现双向数据传输——深度解析WebSocket协议

&#x1f3ac; 江城开朗的豌豆&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 &#x1f4dd; 个人网站 :《 江城开朗的豌豆&#x1fadb; 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! 目录 ⭐ 专栏简介 &#x1f4d8; 文章引言 一、W…

MinIO 分布式文件(对象)存储

简介 MinIO是高性能、可扩展、云原生支持、操作简单、开源的分布式对象存储产品。 在中国&#xff1a;阿里巴巴、腾讯、百度、中国联通、华为、中国移动等等9000多家企业也都在使用MinIO产品 官网地址&#xff1a;http://www.minio.org.cn/ 下载 官网下载(8.4.3版本)&#x…

简述SVM

概述 SVM&#xff0c;即支持向量机&#xff08;Support Vector Machine&#xff09;&#xff0c;是一种常见的监督学习算法&#xff0c;用于分类和回归问题。它是一种基于统计学习理论和结构风险最小化原则的机器学习方法。 SVM的主要思想是在特征空间中找到一个最优的超平面…

网络的地址簿:Linux DNS服务的全面指南

1 dns 1.1 dns&#xff08;域名解析服务&#xff09;介绍 当访问 www.baidu.com 首先查询/etc/hosts&#xff0c;如果没有再去查询/etc/resolv.conf&#xff0c;还是没有就去查询域名服务器 关于客户端: /etc/resolv.conf ##dns指向文件 nameserver 172.25.254.20测试&…

C语言实现将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5

完整代码&#xff1a; // 将一个正整数分解质因数。例如&#xff1a;输入90,打印出902*3*3*5 #include<stdio.h> //定义全局变量&#xff0c;使i可以作用于函数的递归调用中 int i2;void func(int num){//递归结束条件&#xff0c;当这个数除以最后一个它的因子时&#…

Halcon如何使用SaperaLT库连接dalsa相机

halcon安装好的时候&#xff0c;没有带SaperaLT的采集库&#xff0c;需要额外在Halcon官网下载此库。 以下是halcon官网下载此库的链接。官网需要注册才可以下载。 https://www.mvtec.com/downloads/interfaces?tx_mvtecproduct_extensiondownloadlist%5Bfilter%5D%5B0%5Dma…

Linux认识协议

目录 TCP协议通信流程TCP三次握手数据传输过程四次挥手过程TCP 和 UDP 对比 认识协议协议的概念结构化数据的传输序列化和反序列化 网络版计算器服务端代码面向字节流 协议定制客户端代码编写代码测试守护进程守护进程创建 关于协议制定中使用现成方法实现 TCP协议通信流程 下…

【JVM】JDBC案例打破双亲委派机制

&#x1f40c;个人主页&#xff1a; &#x1f40c; 叶落闲庭 &#x1f4a8;我的专栏&#xff1a;&#x1f4a8; c语言 数据结构 javaEE 操作系统 Redis 石可破也&#xff0c;而不可夺坚&#xff1b;丹可磨也&#xff0c;而不可夺赤。 JVM 打破双亲委派机制&#xff08;JDBC案例…

开发直播带货系统源码的技术要点

直播带货系统是一个复杂的技术项目&#xff0c;通常包括前端应用、后端服务器、数据库、支付集成、实时通信以及直播流处理等多个关键组件。以下是开发直播带货系统源码的技术要点&#xff1a; 实时视频流处理 一个成功的直播带货系统需要支持实时视频流的传输和处理。可以使…

【云原生】使用nginx反向代理后台多服务器

背景 随着业务发展&#xff0c; 用户访问量激增&#xff0c;单台服务器已经无法满足现有的访问压力&#xff0c;研究后需要将后台服务从原来的单台升级为多台服务器&#xff0c;那么原来的访问方式无法满足&#xff0c;所以引入nginx来代理多台服务器&#xff0c;统一请求入口…

TCP编程及基础知识

一、端口号 为了区分一台主机接收到的数据包应该转交给哪个进程来进行处理&#xff0c;使用端口号来区分TCP端口号与UDP端口号独立端口用两个字节来表示 2byte&#xff08;65535个&#xff09; 众所周知端口&#xff1a;1~1023&#xff08;1~255之间为众所周知端口&#xff…

Ubuntu网络IP地址一直显示127.0.0.1

问题描述&#xff1a; 终端输入ip a显示127.0.0.1&#xff0c;原来类似192.168.231.1的地址不见了。 ip a 点击网络配置&#xff08;ubuntu桌面版&#xff09;&#xff0c;发现无线网络模块看不见了 正常情况应该有wired 模块&#xff0c;就是下面标红的 解决方案&#xff1a…

学为贵雅思写作备考

准确通顺&#xff0c;言之有物 两次读不懂&#xff0c;6分以下&#xff0c; 6分没有印象&#xff0c;味同嚼蜡&#xff0c;但是没错&#xff08;书面语过关&#xff09; 英语比较过关 8-9分&#xff0c;很有见地 6-7单个的句子读得懂&#xff0c;前后是贯通的、逻辑是通顺…

发现一款PDF转换成翻页电子书的网站

​随着科技的发展&#xff0c;电子书越来越受到人们的喜爱。而PDF格式的文件也越来越多地被人们使用。那么&#xff0c;如何将PDF文件转换成翻页电子书呢&#xff1f;今天就为大家推荐一款好用的PDF转翻页电子书网站。 一、网站介绍 这款网站是一款非常实用的在线转换工具&…

Devchat AI尝鲜试用:程序员开发提效利器,告别脏活累活

DevChat 简介 在当今的软件开发领域&#xff0c;程序员们每天都要面对海量的代码和复杂的任务。尽管技术不断发展&#xff0c;但程序员们依然需要花费大量时间进行重复性工作&#xff0c;如代码审查、错误排查、文档编写等。这些脏活累活不仅消耗了程序员们大量的时间和精力&am…

draw.io与项目管理——如何利用流程图工具提高项目管理效率

draw.io 是一款强大的图形绘制工具&#xff0c;用于创建各种类型的图表、流程图、组织结构图、网络图和平面设计等。它提供了丰富的绘图工具和预定义的图形库&#xff0c;使用户能够轻松创建专业水平的图形作品。 draw.io具有直观的界面和简单易用的功能&#xff0c;适合各种用…

gradle学习笔记

gradle学习笔记 一、下载安装配置环境变量二、使用gradle管理spring项目1、创建项目2、导入项目至编辑器3、打包部署4、将maven项目转为gradle项目 三、gradle介绍1、常用命令2、Gradle Wrapper包装器3、gradle进阶说明4、gradle插件 四、Groovy 简介 参考博客&#xff1a;http…

VM虚拟机逆向 --- [NCTF 2018]wcyvm 复现

文章目录 前言题目分析 前言 第四题了&#xff0c;搞定&#xff0c;算是独立完成比较多的一题&#xff0c;虽然在还原汇编的时候还是很多问题。 题目分析 代码很简单&#xff0c;就是指令很多。 opcode在unk_6021C0处&#xff0c;解密的数据在dword_6020A0处 opcode [0x08, …

原子化 CSS 真能减少体积么?

前言 最近看到这样一篇文章&#xff1a;《要喷也得先做做功课吧&#xff1f;驳Tailwind不好论》 个人觉得说的还是有一定道理的&#xff0c;就是该作者的语气态度可能稍微冲了点&#xff1a; 不过他说的确实有道理&#xff0c;如果这种原子化工具真的如评论区里那帮人说的那么…