04-react基础知识-路由

news2024/11/22 16:51:33

一、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行中传递了一个参数。

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

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

相关文章

Socket 通信

文章目录 Socket 通信创建流程图通信示例对一些概念进行讲述对Socke 编程所用的函数进行讲解 网络通信 和 Socket Socket 通信流程图 &#xff1a; 通信示例 对Socket 编程有一个初步的了解, 看看具体代码是如何实现的. 示例的主要功能: 实现大小写的转化,客户端发送数据 …

传输线的阻抗和反射到底是什么关系?

传输线的阻抗和反射到底是什么关系? 传输线是通信系统中最基本的传输元件之一&#xff0c;它可以将信号从一个端点传输到另一个端点。然而&#xff0c;在实际的通信系统中&#xff0c;传输线往往面临着许多问题&#xff0c;其中最主要的两个问题是阻抗不匹配和信号反射。本文将…

zabbix监控安装-linux

zabbix6.4中文文档1. 简介 (zabbix.com) Zabbix 是一个企业级的开源分布式监控解决方案。 1.zabbix结构体系 Server&#xff1a; server 是存储所有配置、统计和操作数据的中央存储库。 Proxy&#xff1a; zabbix proxy可以代替 Zabbix server 收集性能和可用性数据。p…

linux的美化工具 oh-my-zsh的安装与使用 神器工具

目录 1 安装zsh的环境2 安装 Oh My Zsh3 主题设置重新启动终端:关闭连接 在重新链接一下附加 -插件管理案例讲解看效果 Oh My Zsh 是一款基于 Zsh 的开源命令行工具&#xff0c;它提供了丰富的主题和插件&#xff0c;可以帮助用户更加高效地使用终端。本文将详细介绍 Oh My Zsh…

【StringBuilder和StringBuffer】

文章目录 StringBuilder和StringBufferString类、StringBuilder和StringBuffer的区别 StringBuilder和StringBuffer的区别StringBuilder 字符串逆置 StringBuilder和StringBuffer String类、StringBuilder和StringBuffer的区别 String类的特点是不可变性&#xff0c;所以Stri…

Android项目升级到AndroidX

1、 2、 然后报错了&#xff1a; The gradle plugin version in your project build.gradle file needs to be set to at least com.android.tools.build:gradle:3.2.0 in order to migrate to AndroidX. 修改gradle版本 31报错了就用30.0.0了 3、 提示备份、然后执行do re…

软文发布如何选择对应的媒体

企业做软文推广第一步&#xff0c;就是选择合适的媒体进行投放&#xff0c;然而许多企业不知道如何选择合适的媒体导致推广工作十分被动&#xff0c;无法取得效果&#xff0c;今天媒介盒子就来和大家分享&#xff0c;企业应该如何选择对应的媒体。 一、 媒体类型 根据软文类型…

视频集中存储EasyCVR平台播放一段时间后出现黑屏是什么原因?该如何解决?

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…

有关环境变量

什么是环境变量 用户变量仅对当前用户有效&#xff0c;系统变量对整个系统有效 环境变量就是一个字符串&#xff0c;为了方便修改给隔开了&#xff08;图形化界面&#xff09; 环境变量可以用来配置路径&#xff0c;也可以用来配置其他&#xff0c;比如图中的 NUMBER_OF_PROC…

医院陪诊小程序源码 医院陪诊陪护系统源码

医院陪诊小程序源码 医院陪诊陪护系统源码 陪诊系统小程序&#xff1a;提高陪诊效率&#xff0c;改善医疗服务体验 近年来&#xff0c;随着互联网技术的不断发展&#xff0c;我们的生活中出现了越来越多的智能设备和智能应用&#xff0c;这些智能应用不仅极大方便了我们的生活…

数据仓库工具箱-零售业务

文章目录 一、维度模型设计的4步过程1.1 第一步&#xff1a;选择业务过程1.2 第二步&#xff1a;声明粒度1.3 第三步&#xff1a;确定维度1.4 第四步&#xff1a;确定事实 二、零售业务案例研究2.1 第一步&#xff1a;选择业务过程2.2 第二步&#xff1a;声明粒度2.3 第三步&am…

AI智能客服代替IVR

什么是IVR导航&#xff1f; “欢迎致电XXX客服热线 XXX请按1 XX服务请按2 重听请按3 人工服务请按0 返回请按*号键” 这个导航称为语音导航IVR。传统的电话通道系统通过电话上的按钮广播语音信息来通知客户或等待客户输入内容&#xff0c;然后根据客户的输入进行下一步的…

webgoat-client side客户端问题

client side Bypass front-end restrictions 用户对 Web 应用程序的前端有很大程度的控制权。 它们可以更改 HTML 代码&#xff0c;有时也可以更改脚本。这就是为什么 需要特定输入格式的应用也应在服务器端进行验证&#xff0c;而不是只在前端做限制。 0x02 先提交请求&am…

技术分享 | 想做App测试就一定要了解的App结构

app 的结构包含了 APK 结构和 app 页面结构两个部分 APK结构 APK 是 Android Package 的缩写&#xff0c;其实就是 Android 的安装包。通过将 APK 文件直接传到 Android 模拟器或 Android 手机中执行即可安装。 APK 文件其实是 zip 格式&#xff0c;但后缀名被修改为 apk&am…

虚幻引擎:如何在工程里面添加插件

1.在自己的项目中安装插件 在content目录下创建一个Plugins的文件,将插件文件放进去即可 2.在软件上安装,这样所有创建的项目都会带有此插件 将插件放在自己软件的这个目录下就好了

【JavaSE】基础笔记 - 类和对象(下)

目录 1、this引用 1.1、为什么要有this引用 1.2、什么是this引用 1.3、 this引用的特性 2、 对象的构造及初始化 2.1、 如何初始化对象 2.2、构造方法 2.2.1、概念 2.2.2、特性 2.3、默认初始化 2.4、就地初始化 上篇&#xff1a;【JavaSE】基础笔记 - 类和对象&#…

拥抱电大新时代,助力学业攀升——广东开放大学电大搜题微信公众号助您一臂之力

随着信息时代的快速发展和教育的普及化&#xff0c;广东开放大学作为一所以开放教育为主要特色的学府&#xff0c;致力于为更多渴望进修和提升自己的学子们提供良好的学习环境和便捷的学习工具。在这个日新月异的时代&#xff0c;我们尽力拓宽学生学习的途径&#xff0c;让学子…

京东数据分析(京东销量):2023年9月京东投影机行业品牌销售排行榜

鲸参谋监测的京东平台9月份投影机市场销售数据已出炉&#xff01; 根据鲸参谋电商数据分析平台的相关数据数据显示&#xff0c;9月份&#xff0c;京东平台投影机的销量为13万&#xff0c;环比下滑约17%&#xff0c;同比下滑约25%&#xff1b;销售额将近2.6亿&#xff0c;环比下…

左孩子右兄弟

左孩子右兄弟 - 蓝桥云课 (lanqiao.cn) 这个题讲解一下思路。 看图 把样例转为二叉树&#xff1a; 我们可以发现所谓左孩子右兄弟就是说把一个节点的所有孩子节点中选取一个作为左子节点&#xff0c;这个节点的剩余孩子节点依次链接在这个左孩子节点的右边&#xff0c;直到某…

【送书福利-第二十五期】《AI时代系列书籍》

&#x1f60e; 作者介绍&#xff1a;我是程序员洲洲&#xff0c;一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专家博主、前后端开发、人工智能研究生。公粽号&#xff1a;程序员洲洲。 &#x1f388; 本文专栏&#xff1a;本文…