react路由 - react-router-dom

news/2024/7/15 18:14:41 标签: react.js, 前端, javascript

react路由

  • 现代的前端应用大多都是 SPA(单页应用程序),也就是只有一个 HTML 页面的应用程序。因为它的用户体验更好、对服务器的压力更小,所以更受欢迎。为了有效的使用单个页面来管理原来多页面的功能,前端路由应运而生
  • 前端路由是一套映射规则,在React中,是 URL路径 与 组件 的对应关系

react-router-dom

  • React实现页面路由的模块:react-router-dom

路由器组件:< HashRouter > < BrowserRouter >

  • HashRouter
    • hash模式
    • 全局路由切换
  • BrowserRouter
    • history模式
    • 单页面的路由切换
  • hash 路由和 history 路由的区别:
    • 原理不同: hash 路由是通过监听 hashChange 事件实现;history路由是通过 调用 history.pushState 方法 和监听 popState 事件实现
    • 表现方式不同:hash 路由前面带 # ;history路由没有
    • history路由在页面刷新的时候可能会有白屏的情况;因为刷新后浏览器会向服务器发送这个地址的请求,但文件资源并不存在,会报404错误;需要后端做一个保底映射,所有的请求全部拦截到index.html上。
  • 使用方式:
//例如:
import {
    // HashRouter as Router, // hash模式
    BrowserRouter as Router, // history模式
    Route,
    Switch,
  } from 'react-router-dom'
  import Home from '../containers/home'

  const BasicRouter = () => (
  	  <Router>
  	    <Switch>
  	      <Route exact path="/" component={Home} />
  	    </Switch>
  	  </Router>
  	)
  	
  	export default BasicRouter

Route 标签:定义具体组件

  • 语法:
//v5版本:
<Route path="/xx/xx" component={组件}></Route>  
//v6:
<Route path="/xx/xx" element={<组件名/>}/>
  • v5以及其他老版本:
    • 当路由为 / 时,默认模糊匹配;这样可能会存在匹配到多个的问题
    • 用 Switch 标签包裹之后:按顺序 自上而下 匹配
    • exact 属性可以设置为精准匹配
  • v6版本:
    • 默认 精准匹配;匹配完整路径;
    • 不需要Switch 标签、exact 属性
    • 若要匹配某一部分,则在路径后面加 /*
    • 可以将path 设置为 *,用于实现 404页面

Link 标签、NavLink标签

  • 类似 a 标签,用于跳转
  • NavLink:可以设置激活状态的样式
    • 老版本:可以通过 activeClassName 或 activeStyle 设置
    • v6:可以通关箭头函数 接收isActive

Navigate 组件

  • 用于重定向
  • 老版本:Redirect 标签重定向
   import { Navigate } from "react-router-dom";
   function A() {
     return <Navigate to="/b" />;
   }
     ```
## useNavigate 编程式路由跳转
+ 可以通过 JS 代码完成路由跳转
+ useNavigate取代了原先版本中的useHistory
+  可以直接传入要跳转的目标路由
```js
   import { useNavigate } from 'react-router-dom';
   
   function Foo(){
       const navigate = useNavigate();
       return (
           // 上一个路径:/a;    当前路径: /a/a1
           <div onClick={() => navigate('/b')}>跳转到/b</div>
           <div onClick={() => navigate('a11')}>跳转到/a/a1/a11</div>
           <div onClick={() => navigate('../a2')}>跳转到/a/a2</div>
           <div onClick={() => navigate(-1)}>跳转到/a</div>
       )
   }

动态路由参数

useParams 获取路径参数

  • 在Route组件中的path属性中定义路径参数
  • 在组件内通过useParams hook 访问路径参数
	<BrowserRouter>
	  <Routes>
	    <Route path="/foo/:id" element={<Foo />} />
	  </Routes>
	</BrowserRouter>;
	
	import { useParams } from "react-router-dom";
	export default function Foo() {
	  const params = useParams();
	  return (
	    <div>
	      <h1>{params.id}</h1>
	    </div>
	  );
	}

useSearchParams 访问和修改查询参数

  • 使用 useSearchParams hook 来访问和修改查询参数。其用法和 useState 类似,会返回当前对象和更改它的方法
  • 使用 setSearchParams 时,必须传入所有的查询参数,否则会覆盖已有参数
	import { useSearchParams } from "react-router-dom";
	// 当前路径为 /foo?id=12
	function Foo() {
	  const [searchParams, setSearchParams] = useSearchParams();
	  console.log(searchParams.get("id")); // 12
	  setSearchParams({
	    name: "foo",
	  }); // /foo?name=foo
	  return <div>foo</div>;
	}

路径匹配规则

  • 当URL同时匹配到含有路径参数的路径和无参数路径时,优先匹配没有参数的”具体的“(specific)路径。
<Route path="teams/:teamId" element={<Team />} />
<Route path="teams/new" element={<NewTeamForm />} />
//如上的两个路径,将会匹配 teams/new

History 对象


http://www.niftyadmin.cn/n/63186.html

相关文章

java手机短信验证,并存入redis中,验证码时效5分钟

目录 1、注册发送短信账号一个账号 2、打开虚拟机&#xff0c;将redis服务端打开 3、创建springboot工程&#xff0c;导入相关依赖 4、写yml配置 5、创建controller层&#xff0c;并创建controller类 6、创建service层&#xff0c;并创建service类 7、创建工具类&#x…

基于“PLUS模型+“生态系统服务多情景模拟预测

工业革命以来&#xff0c;社会生产力迅速提高&#xff0c;人类活动频繁&#xff0c;此外人口与日俱增对土地的需求与改造更加强烈&#xff0c;人-地关系日益紧张。此外&#xff0c;土地资源的不合理开发利用更是造成了水土流失、植被退化、水资源短缺、区域气候变化、生物多样性…

GAMES101作业7及课程总结(重点实现多线程加速,微表面模型材质)

目录闲言碎语最终全部效果展示&#xff08;均为10241024512ssp&#xff09;课程总结与理解&#xff08;Path Tracing&#xff09;框架梳理任务一&#xff1a;迁移相关代码任务二&#xff1a;实现path tracing任务三&#xff1a;多线程加速&#xff08;包括其他加速的小trick&am…

Ajax 学习笔记

一、Ajax1.1 什么是AjaxAJAX Asynchronous JavaScript and XML(异步的JavaScript和XML)。Ajax是一种在无需加载整个网页的情况下&#xff0c;能够更新部分网页的技术&#xff0c;它不是一种新的编程语言&#xff0c;而是一种用于创建更好更快以及交互性更强的Web应用程序的技术…

Python语言零基础入门教程(十六)

Python 模块 Python 模块(Module)&#xff0c;是一个 Python 文件&#xff0c;以 .py 结尾&#xff0c;包含了 Python 对象定义和Python语句。 模块让你能够有逻辑地组织你的 Python 代码段。 把相关的代码分配到一个模块里能让你的代码更好用&#xff0c;更易懂。 模块能定…

智慧税务+数据可视化:企业财务管理告别难题

一、引言在发展社会主义市场经济的过程中&#xff0c;税收承担着组织财政收入、调控经济、调节社会分配的职能。中国每年财政收入的90%以上来自税收&#xff0c;其地位和作用越来越重要&#xff0c;可称之为国家经济的“晴雨表”&#xff0c;有效进行税务管理、充分挖掘税务大数…

都说高速信号过孔尽量少,高速先生却说有时候多点反而好?

作者&#xff1a;一博科技高速先生成员 黄刚过孔在高速领域可谓让硬件工程师&#xff0c;PCB设计工程师甚至仿真工程师都闻风丧胆&#xff0c;首先是因为它的阻抗没法像传输线一样&#xff0c;通过一些阻抗计算软件来得到&#xff0c;一般来说只能通过3D仿真来确定&#xff0c;…

【图像分类】基于PyTorch搭建LSTM实现MNIST手写数字体识别(单向LSTM,附完整代码和数据集)

写在前面: 首先感谢兄弟们的关注和订阅,让我有创作的动力,在创作过程我会尽最大能力,保证作品的质量,如果有问题,可以私信我,让我们携手共进,共创辉煌。 提起LSTM大家第一反应是在NLP的数据集上比较常见,不过在图片分类中,它同样也可以使用。我们以比较熟悉的 mnist…