react之路由的安装与使用

news2024/11/19 22:45:55

一、路由安装

  • 路由官网
  • 2021.11月初,react-router 更新到 v6 版本。
  • 使用最广泛的 v5 版本的使用
npm i react-router-dom@5.3.0

二、路由使用

2.1 路由的简单使用

第一步 在根目录下 创建 views 文件夹 ,用于放置路由页面

在这里插入图片描述

  • films.js示例代码
export default function Films() {
  return <div>films</div>
}

第二步 在根目录下 创建router文件夹,并新建indexRouter.js文件 用来管理路由

  • indexRouter.js 页面示例代码
//1.引入 hashrouter
import { HashRouter, Route } from 'react-router-dom'

import { Component } from 'react'

//2.引入组件
import Films from '../views/films'
import Cinemas from '../views/cinemas'
import Center from '../views/center'
export default class IndexRouter extends Component {
  render() {
    return (
      //3 使用
      <HashRouter>
        <Route path="/films" component={Films}></Route>
        <Route path="/cinemas" component={Cinemas}></Route>
        <Route path="/center" component={Center}></Route>
      </HashRouter>
    )
  }
}

第三步 在App.js中 引入indexRouter

  • App.js中示例代码
import IndexRouter from './router/indexRouter'
export default function App() {
  return (
    <div>
      <IndexRouter></IndexRouter>
    </div>
  )
}

第四步 在入口文件index.js中渲染页面

  • index.js示例代码
import React from 'react'

import ReactDom from 'react-dom/client'

import App from './App.js'

ReactDom.createRoot(document.querySelector('#root')).render(<App></App>)

2.2 路由的重定向

第一步 引入Redirect

import { HashRouter, Route, Redirect } from 'react-router-dom'

第二步 使用 (模糊匹配)

  • 默认模糊匹配
export default class IndexRouter extends Component {
  render() {
    return (
      //3 使用
      <HashRouter>
        <Route path="/films" component={Films}></Route>
        <Route path="/cinemas" component={Cinemas}></Route>
        <Route path="/center" component={Center}></Route>

        {/* 路由的重定向  模糊匹配*/}
        <Redirect from="/" to="/films"></Redirect>
      </HashRouter>
    )
  }
}

2.3 路由Switch组件与404页面

Switch组件

  • 包裹 Route 组件,只会渲染第一个匹配的组件,即使有多个路由都可以匹配成功

    • 在实际开发时,通常会用 Switch 组件包裹 Route 组件
    • 通过 Switch 组件非常容易的就能实现 404 页面功能
  • 需引入

import { HashRouter, Route, Redirect, Switch } from 'react-router-dom'

//switch 包裹router标签
 <Switch>
    <Route path="/films" component={Films}></Route>
    ....中间省略....
    {/* 404页面 */}
    <Route component={NotFound}></Route>
 </Switch>

404 页面实现

  • 1.views目录下新建notFound.js
  • 2.路由indexRouter.js中引入
import NotFound from '../views/notFound'
  • 3.使用
<HashRouter>
<Switch>
    <Route path="/films" component={Films}></Route>
    <Route path="/cinemas" component={Cinemas}></Route>
    <Route path="/center" component={Center}></Route>

    {/* 路由重定向 精确匹配 exact 必须外边用Switch标签包裹	 */}
       <Redirect from="/" to="/films" exact></Redirect>

    {/* 404页面 */}
    <Route component={NotFound}></Route>
</Switch>

2.4 路由嵌套

  • 必须一级路由是模糊匹配!!!
  • 1.新建二级路由页面,并在一级路由页面引入
  • 2.一级路由页面配置路由信息
  • 一级路由示例代码
//引入switch route
import { Switch, Route, Redirect } from 'react-router-dom'

//引入
import One from './films/one'
import Two from './films/two'
export default function Films() {
  return (
    <div>
      films
      <Switch>
        <Route path="/films/one" component={One}></Route>
        <Route path="/films/two" component={Two}></Route>
        {/* 重定向 */}
        <Redirect from="/films" to="/films/one"></Redirect>
      </Switch>
    </div>
  )
}

2.5 声明式导航与编程式导航

2.5.1 声明式导航

通过 a链接 进行跳转

//需加 #
  <a href="#/center">我的</a>

通过NavLink 进行跳转

//1.引入
import { NavLink } from 'react-router-dom'
      ....
    <NavLink to="/center">我的</NavLink>

2.5.2 编程式导航

核心代码

import axios from 'axios'
import { useState, useEffect } from 'react'
import { useHistory } from 'react-router-dom'
export default function Tabbar(props) {
  console.log('打印props', props)
  let history = useHistory() //将useHistory()钩子赋值给history方便使用
  const [list, setList] = useState([])
  useEffect(() => {
    axios
      .get('http://localhost:3000/data.json')
      .then((res) => {
        console.log('接口请求成功', res)
        setList(res.data.tabs)
      })
      .catch((err) => {
        console.log('接口请求失败', err)
      })
  }, [])
  const toDetails = (id) => {
    console.log('编程式导航', id)
    // 原生js 跳转
    // window.location.href = 'http://localhost:3000/#/cinemas'

     history.push(`/detail/${id}`)
  }
  return (
    <>
      <h1>编程式导航</h1>
      <ul>
        {list.map((item, index) => (
          <li key={item.id} onClick={() => toDetails(item.id)}>
            {item.name}
          </li>
        ))}
      </ul>
    </>
  )
}

2.6 路由传参

2.6.1 动态路由传参

核心代码

  • 传递参数页面
import axios from 'axios'
import { useState, useEffect } from 'react'
import { NavLink, useHistory } from 'react-router-dom'
export default function Tabbar(props) {
  console.log('打印props', props)
  let history = useHistory() //将useHistory()钩子赋值给history方便使用
  const [list, setList] = useState([])
  useEffect(() => {
    axios
      .get('http://localhost:3000/data.json')
      .then((res) => {
        console.log('接口请求成功', res)
        setList(res.data.tabs)
      })
      .catch((err) => {
        console.log('接口请求失败', err)
      })
  }, [])
  const toDetails = (id) => {
    //1.history.push跳转传参
   history.push(`/detail/${id}`)
  }
  return (
    <>
      <ul>
        {list.map((item, index) => (
          <li key={item.id} onClick={() => toDetails(item.id)}>
            {item.name}
          </li>
        ))}
      </ul>
    </>
  )
}

  • 路由页面
{/* 详情 :myid接参占位 */}
{/* history.push跳转传参 */}
<Route path="/detail/:myid" component={Detail}></Route>

  • 接参页面
export default function Detail(props) {
  // history.push跳转传参
  console.log('详情', props.match.params.myid)
  return <div>详情页面</div>
}

2.6.2 state传参

  • 传递参数页面
import axios from 'axios'
import { useState, useEffect } from 'react'
import { useHistory } from 'react-router-dom'
export default function Tabbar(props) {
  console.log('打印props', props)
  let history = useHistory() //将useHistory()钩子赋值给history方便使用
  const [list, setList] = useState([])
  useEffect(() => {
    axios
      .get('http://localhost:3000/data.json')
      .then((res) => {
        console.log('接口请求成功', res)
        setList(res.data.tabs)
      })
      .catch((err) => {
        console.log('接口请求失败', err)
      })
  }, [])
  const toDetails = (id) => {

    //state传参
     history.push({ pathname: '/detail', state: { myid: id } })
  }
  return (
    <>
      <ul>
        {list.map((item, index) => (
          <li key={item.id} onClick={() => toDetails(item.id)}>
            {item.name}
          </li>
        ))}
      </ul>
    </>
  )
}

  • 路由配置
<Route path="/detail" component={Detail}></Route>
  • 接参页面
export default function Detail(props) {
  //第二种传参
 console.log('第二种传参', props.location.state.myid)

  return <div>详情页面</div>

2.7 路由拦截

  • 需求:没有token(未登录) 跳转到登录页面
  • 1.定义函数 用于返回本地是否有token
  isLogin() {
    console.log('是否登录', localStorage.getItem('token'))
    return localStorage.getItem('token')
  }
  • 2.创建登录页 并路由引入配置登录页
 {/* 登录页面 */}
 <Login path="/login" component={Login}></Login>
  • 3.在需要判断的页面路由上 动态判断
//是否登录 登录跳转至该页面 未登录 重定向登录页面
<Route path="/center" render={() =>
     this.isLogin() ? <Center /> : <Redirect to="/login"></Redirect>
   }>
 </Route>

2.8 路由模式

  • 1.哈希模式 路径带# HashRouter
  • 2.BrowserRouter 路径没有# 真正朝后端发请求
//引入BrowserRouter 
import {
  BrowserRouter as Router,
} from 'react-router-dom'

...
//使用
<Router>
	<Switch>
		...路由...
	</Switch>
</Router>

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

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

相关文章

IDM最新版2023不限速下载网盘详细操作教程

开启这个开关&#xff0c;让你的浏览器下载速度翻倍!大家有没有听说过IDM下载器&#xff0c;那是因为它的多线程下载功能&#xff0c;所以下载速度快&#xff0c;其实我们的浏览器也有多线程下载功能&#xff0c;只是默认关闭了而已&#xff0c;只需开启它&#xff0c;就可以有…

商城-学习整理-高级-性能压测缓存问题(十一)

目录 一、基本介绍1、性能指标2、JMeter1、JMeter 安装2、JMeter 压测示例1、添加线程组2、添加 HTTP 请求3、添加监听器4、启动压测&查看分析结果 3、JMeter Address Already in use 错误解决 二、性能监控1、jvm 内存模型2、堆3、jconsole 与 jvisualvm1、jvisualvm 能干…

sd-webui安装comfyui扩展

文章目录 导读ComfyUI 环境安装1. 安装相关组件2. 启动sd-webui3. 访问sd-webui 错误信息以及解决办法 导读 这篇文章主要给大家介绍如何在sd-webui中来安装ComfyUI插件 ComfyUI ComfyUI是一个基于节点流程式的stable diffusion的绘图工具&#xff0c;它集成了stable diffus…

第8章:集成学习

个体与集成 同质&#xff1a;相同的基学习器&#xff0c;实现容易&#xff0c;但是很难保证差异性。异质&#xff1a;不同的基学习器&#xff0c;实现复杂&#xff0c;不同模型之间本来就存在差异性&#xff0c;但是很难直接比较不同模型的输出&#xff0c;需要复杂的配准方法。…

【PACS源码】认识PACS的架构和工作流程

&#xff08;一&#xff09;PACS系统的组成及架构 PACS系统的基本组成部分包括&#xff1a;数字影像采集、通讯和网络、医学影像存储、医学影像管理、各类工作站五个部分。 而目前PACS系统的软件架构选型上看&#xff0c;主要有C/S和B/S两种形式。 C/S架构&#xff0c;即Client…

iMazing2.17.3免费版苹果传输电脑端文件数据工具

苹果手机在日常使用过程中可能会遇到iPhone内存不足的情况&#xff0c;遇到这种情况很多用户会选择删除照片来节省存储空间&#xff0c;大量删除照片可能会误删重要照片。另外iPhone可能会遇到自动重启、黑屏等故障。手机突然损坏&#xff0c;数据无法导出&#xff0c;此时备份…

判断链表中是否有环

如下图&#xff0c;如何判断链表中存在环路呢&#xff1f; 一种简单的方法描述&#xff1a; 设置两个链表指针p1和p2并指向链表&#xff0c;设置两个记录指针移动次数的变量c1和c2。在循环中&#xff0c;p1每次移动2个位置&#xff0c;c1加2&#xff1b;p1每次移动一个位置&am…

Redis高可用:哨兵机制(Redis Sentinel)详解

目录 1.什么是哨兵机制&#xff08;Redis Sentinel&#xff09; 2.哨兵机制基本流程 3.哨兵获取主从服务器信息 4.多个哨兵进行通信 5.主观下线和客观下线 6.哨兵集群的选举 7.新主库的选出 8.故障的转移 9.基于pub/sub机制的客户端事件通知 1.什么是哨兵机制&#xf…

被信息爆炸反噬了,自食恶果

我前两年回答的一个问题&#xff0c;最近频频收到点赞的消息提醒。 然后&#xff0c;我又思考了一下&#xff0c;我感觉信息价值危机随着生成式 AI 的诞生&#xff0c;可能会越来越严重。 什么问题呢&#xff1f; 有人提问&#xff1a; 现在中文互联网能搜索到的有价值信息越来…

【Android】设置-显示-屏保-启用时机-去除插入基座相关(不支持该功能的话)

设置-显示-屏保-启用时机-去除插入基座相关&#xff08;不支持该功能的话&#xff09; 1-项目场景&#xff1a;2-问题描述3-解决方案&#xff1a;4-代码修改前后效果对比图&#xff1a;代码修改前&#xff1a;代码修改后&#xff1a; 1-项目场景&#xff1a; 展锐平台 2-问题描…

C语言中常见的一些语法概念和功能

常用代码&#xff1a; 程序入口&#xff1a;int main() 函数用于定义程序的入口点。 输出&#xff1a;使用 printf() 函数可以在控制台打印输出。 输入&#xff1a;使用 scanf() 函数可以接收用户的输入。 条件判断&#xff1a;使用 if-else 语句可以根据条件执行不同的代码…

服装定制小程序

如今&#xff0c;人们对时尚的追求已不仅仅停留在传统的购买与穿搭上&#xff0c;而是更加注重个性化和定制化的需求。为满足这一需求&#xff0c;乔拓云网推出了一款创新的服装定制小程序&#xff0c;为用户提供定制专属时尚的全新旅途。 通过进入【乔拓云】后台&#xff0c;用…

大数据平台运维实训室建设方案

一、概况 本实训室的主要目的是培养大数据平台运维项目的实践能力,以数据计算、分析、挖掘和可视化的案例训练为辅助。同时,实训室也承担相关考评员与讲师培训考试、学生认证培训考试、社会人员认证培训考试、大数据技能大赛训练、大数据专业课程改革等多项任务。 实训室旨在培…

《游戏编程模式》学习笔记(五)原型模式 Prototype Pattern

原型的定义 用原型实例指定创建对象的种类&#xff0c;并且通过拷贝这些原型创建新的对象。 举个例子 假设我现在要做一款游戏&#xff0c;这个游戏里有许多不同种类的怪物&#xff0c;鬼魂&#xff0c;恶魔和巫师。这些怪物通过“生产者”进入这片区域&#xff0c;每种敌人…

C++11并发与多线程笔记(9) async、future、packaged_task、promise

C11并发与多线程笔记&#xff08;9&#xff09; async、future、packaged_task、promise 1、std::async、std::future创建后台任务并返回值2、std::packaged_task&#xff1a;打包任务&#xff0c;把任务包装起来3、std::promise3、小结 1、std::async、std::future创建后台任务…

【ARM Linux 系统稳定性分析入门及渐进10 -- GDB 初始化脚本介绍及使用】

文章目录 gdb 脚本介绍gdb 初始化脚本使用启动 gdb 的时候自动执行脚本gdb运行期间执行命令脚本 gdb 脚本介绍 GDB脚本是一种使用GDB命令语言编写的脚本&#xff0c;可以用来自动化一些常见的调试任务。这些脚本可以直接在GDB中运行&#xff0c;也可以通过GDB的-x参数或source…

Unity 之NavMeshAgent 组件(导航和路径寻找的组件)

文章目录 **作用**&#xff1a;**属性和方法**&#xff1a;**用途**&#xff1a;**注意事项**&#xff1a; NavMeshAgent 是Unity引擎中用于导航和路径寻找的组件。它可以使游戏对象在场景中自动找到可行走的路径&#xff0c;并在避免障碍物的情况下移动到目标位置。 以下是关于…

实现Java异步调用的高效方法

文章目录 为什么需要异步调用&#xff1f;Java中的异步编程方式1. 使用多线程2. 使用Java异步框架 异步调用的关键细节结论 &#x1f389;欢迎来到Java学习路线专栏~实现Java异步调用的高效方法 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&#x1f379;✨博客主页&#xff1a;IT陈寒的博…

Google开源了可视化编程框架Visual Blocks for ML

Visual Blocks for ML是一个由Google开发的开源可视化编程框架。它使你能够在易于使用的无代码图形编辑器中创建ML管道。 为了运行Visual Blocks for ML。需要确保你的GPU是可以工作的。剩下的就是clone代码&#xff0c;然后运行&#xff0c;下面我们做一个简单的介绍&#xf…

【24择校指南】南京农业大学计算机考研考情分析

南京农业大学 考研难度&#xff08;☆☆&#xff09; 内容&#xff1a;23考情概况&#xff08;拟录取和复试分析&#xff09;、院校概况、专业目录、参考书目、23复试详情、各专业考情分析、各科目考情分析。 正文1315字&#xff0c;预计阅读&#xff1a;3分钟。 2023考情概…