• 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.最简单的写法

    1. let router = createBrowserRouter([
    2. {
    3. //页面访问的路径
    4. path: '/home',
    5. //访问path路径时,页面显示element里的组件
    6. element: <div>首页页面</div>
    7. },
    8. {
    9. path: '/user',
    10. element: <div>用户页面</div>
    11. },
    12. {
    13. path: '/login',
    14. element: <div>登录呀呀呀</div>
    15. },
    16. ])

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

    需要使用到高阶组件

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

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

    1. import ReactDOM from 'react-dom/client'
    2. import { createBrowserRouter, RouterProvider } from 'react-router-dom'
    3. // 将path传进去
    4. let load = (path) => {
    5. // 使用高阶组件,若要进行页面之间的跳转,必须使用suspense标签将其组件括起来,不然的话会报错嘞!!!
    6. let Comp = React.lazy(() => import(path))
    7. return (<React.Suspense>
    8. <Comp></Comp>
    9. </React.Suspense>)
    10. }
    11. let router = createBrowserRouter([
    12. {
    13. path: '/home',
    14. element: load('./component/01-son.jsx')
    15. },
    16. {
    17. path: '/granson',
    18. element: load('./component/hook/02-granSon')
    19. }
    20. ])
    21. ReactDOM.createRoot(document.getElementById('root')).render(
    22. // 在根组件中使用RouterProvider来提供路由功能
    23. <RouterProvider router={router}></RouterProvider>
    24. )

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

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

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

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

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

    1.利用link标签进行跳转

    1. //son页面
    2. import React, { useState } from 'react'
    3. import { Link } from 'react-router-dom'
    4. function Son() {
    5. return (
    6. <div>
    7. <h2>son页面</h2>
    8. {/* 使用link进行专拣之间的跳转:减少了页面刷新的次数 */}
    9. <Link to='/granson'>跳转到granson页面</Link><br />
    10. //link标签跳转的第二种写法:to里面是两个花括号*****************************
    11. <Link to={{ pathname: '/granson' }}>跳转</Link><br />
    12. {/* a标签也可以实现页面跳转,但页面每次刷新,都会重新加载页面 */}
    13. <a href="/granson">a标签跳转</a><br />
    14. <Link to='http://www.baidu.com'>link链接到百度地址</Link><br />
    15. <a href="'http://www.baidu.com">a链接到百度地址</a>
    16. </div>
    17. )
    18. }
    19. export default Son
    20. //granson页面
    21. import React, { useContext } from 'react'
    22. function Grandson() {
    23. return (
    24. <div>
    25. <h5>Grandson页面</h5>
    26. </div>
    27. )
    28. }
    29. export default Grandson

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

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

    1. import React, { useState } from 'react'
    2. import { useNavigate } from 'react-router-dom'
    3. function Son() {
    4. // 定义一个变量来接收刚刚引进来的函数
    5. let router = useNavigate()
    6. // 点击按钮router就去匹配相对应的组件进行跳转
    7. // 编程式写法的第一种写法=====================================
    8. function tiaozhuan() {
    9. router('/granson')
    10. }
    11. // 编程式写法的第二种写法======================================
    12. function tiao() {
    13. router({ pathname: "/granson" })
    14. }
    15. return (
    16. <div>
    17. <h2>son页面</h2>
    18. <button onClick={tiaozhuan}>点击跳转到granson页面</button><br /><br />
    19. <button onClick={tiao}>点击跳转到granson页面</button>
    20. </div>
    21. )
    22. }
    23. export default Son

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

            1.state传参(常用)

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

                                                    2.给定一个假的数据obj

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

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

                                                                                                   (2:state是要传递的数据

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

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

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

    1. //son组件中====================================================================
    2. import React, { useState } from 'react'
    3. import { useNavigate } from 'react-router-dom'
    4. function Son() {
    5. let [obj, setobj] = useState([{ id: 1, name: "衣服", price: "125元", comment: "质量挺好好哈" },
    6. { id: 2, name: "裤子", price: "133元", comment: "真棒呀!!" },
    7. { id: 3, name: "鞋子", price: "232元", comment: "不错哦" }])
    8. let navigate = useNavigate()
    9. console.log(obj);
    10. function change(id) {
    11. console.log(id);
    12. // 使用navigate实现页面跳转,state来进行传递参数,这里是将id传递过去
    13. navigate({ pathname: "/granson" }, { state: { id } })
    14. }
    15. return (
    16. <div>
    17. <h2>son页面</h2>
    18. <div>{obj.map(el => <div key={el.id}>
    19. <div>{el.name}</div>
    20. <div>{el.price}</div>
    21. <div>{el.comment}</div>
    22. {/* 点击button传递相应的参数id传递给change函数 */}
    23. <button onClick={() => { change(el.id) }}>点击跳转到granson页面</button>
    24. </div>)}
    25. </div>
    26. </div>
    27. )
    28. }
    29. export default Son
    30. //granson组件中
    31. import React, { useContext } from 'react'
    32. // 1.1在组件页面需要引入uselocation
    33. import { useLocation } from 'react-router-dom'
    34. function Grandson() {
    35. //1.2: 用一个变量来接收uselocation函数
    36. let obj = useLocation()
    37. // 在控制台的state中可以看到从son组件中传递过来的id和obj数据
    38. console.log(obj);
    39. return (
    40. <div>
    41. <h5>Grandson页面</h5>
    42. <div>{obj.state.id}</div>
    43. {/* 在granson页面可以正常使用 */}
    44. <div>{obj.state.obj[0].name}</div>
    45. </div>
    46. )
    47. }
    48. export default Grandson

            2.query传参

                    1.引入useNavitage

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

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

                                                                 (2:search是要传递的数据

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

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

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

    1. /son组件中===============================================================================
    2. import React, { useState } from 'react'
    3. import { useNavigate } from 'react-router-dom'
    4. function Son() {
    5. let [obj, setobj] = useState([{ id: 1, name: "衣服", price: "125元", comment: "质量挺好好哈" },
    6. { id: 2, name: "裤子", price: "133元", comment: "真棒呀!!" },
    7. { id: 3, name: "鞋子", price: "232元", comment: "不错哦" }])
    8. let navigate = useNavigate()
    9. console.log(obj);
    10. function change(id) {
    11. console.log(id);
    12. // 使用navigate实现页面跳转,search来进行传递参数
    13. navigate({ pathname: "/granson", search: "id=32&name='衣服'" })
    14. }
    15. return (
    16. <div>
    17. <h2>son页面</h2>
    18. <div>{obj.map(el => <div key={el.id}>
    19. <div>{el.name}</div>
    20. <div>{el.price}</div>
    21. <div>{el.comment}</div>
    22. {/* 点击button传递相应的参数id传递给change函数 */}
    23. <button onClick={() => { change(el.id) }}>点击跳转到granson页面</button>
    24. </div>)}
    25. </div>
    26. </div>
    27. )
    28. }
    29. export default Son
    30. //granson组件中=====================================================================
    31. import React, { useContext } from 'react'
    32. // 1.1在组件页面需要引入uselocation
    33. import { useLocation } from 'react-router-dom'
    34. function Grandson() {
    35. //1.2: 用一个变量来接收uselocation函数
    36. let obj = useLocation()
    37. // 在控制台的state中的search可以看到传递过来的数据,但不能直接使用,需要自己进一步处理后再使用
    38. console.log(obj);
    39. return (
    40. <div>
    41. <h5>Grandson页面</h5>
    42. </div>
    43. )
    44. }
    45. export default Grandson

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

            3.动态路由传参

    1. granson路由部分=========================================================
    2. {
    3. path: '/granson/:dt',
    4. element: load('./component/hook/02-granSon')
    5. }
    6. //son组件部分=======================================================================
    7. import React, { useState } from 'react'
    8. import { useNavigate } from 'react-router-dom'
    9. function Son() {
    10. let navigate = useNavigate()
    11. function change() {
    12. // 在后面的控制台中的pathname中可以看到/granson/2023这个数据
    13. navigate({ pathname: "/granson/2023" })
    14. }
    15. return (
    16. <div>
    17. <h2>son页面</h2>
    18. <button onClick={change}>点击跳转到granson页面</button>
    19. </div>
    20. )
    21. }
    22. export default Son
    23. //granson组件组分==========================================================================
    24. import React, { useContext } from 'react'
    25. // 1.1在组件页面需要引入uselocation
    26. import { useLocation } from 'react-router-dom'
    27. function Grandson() {
    28. //1.2: 用一个变量来接收uselocation函数
    29. let obj = useLocation()
    30. console.log(obj);
    31. return (
    32. <div>
    33. <h5>Grandson页面</h5>
    34. </div>
    35. )
    36. }
    37. export default Grandson

    57行中传递了一个参数。

  • 相关阅读:
    yml中无法解析类 ‘HikariDataSource‘
    Python编程实例-Python的隐藏特性
    (01)ORB-SLAM2源码无死角解析-(58) 闭环线程→计算Sim3: 源码Sim3Solver::iterate()讲解
    【华为OD机试真题 python】解密犯罪时间 【2022 Q4 | 100分】
    【JVM笔记】堆的核心概述与堆空间大小的设置与查看
    2023最新SSM计算机毕业设计选题大全(附源码+LW)之java拼车平台0k47u
    香橙派 Kunpeng Pro 上手初体验
    Linux常⽤服务器构建-samba
    手把手教大家搭建微信公众号查题
    React 入门:组件实例三大属性之refs
  • 原文地址:https://blog.csdn.net/weixin_68211919/article/details/134270039