深入理解react-router 路由的实现原理

yizhihongxing

下面是深入理解react-router路由的实现原理的攻略。

1. 路由的概念

路由是指通过URL来定位到特定的页面并展示给用户的过程。在前端 SPA(单页应用)中,我们通常使用第三方库来实现路由功能,其中react-router是使用较为广泛的一种。

2. react-router的实现原理

首先,我们需要了解react-router的实现原理是基于history浏览器历史API的。

2.1 history 对象

history是一个封装了浏览器历史API的对象,可以让我们在代码中操作浏览器地址栏。使用history可以通过以下几种方式改变URL,从而实现路由功能:

  • pushState:向浏览器历史栈中添加一个状态,并跳转到新的页面。
  • replaceState:用新的状态替换当前页的历史条目。
  • popstate:监听浏览器历史变化事件。

2.2 react-router 实现路由

react-router封装了history对象的能力,通过监听history对象的变化来实现路由跳转的功能。

react-router 中,BrowserRouterHashRouter都是Router的子类,而Router则是history库提供的createBrowserHistory/createHashHistory的封装。这个过程涉及到了history浏览器历史API中的popstate方法,我们来看一下示例代码:

// 创建一个 BrowserRouter
import React from 'react';
import { BrowserRouter, Route, Switch } from 'react-router-dom';

function App() {
  return (
    <BrowserRouter>
      <Switch>
        <Route path="/" exact={true} component={Home} />
        <Route path="/about" component={About} />
        <Route path="/contact" component={Contact} />
      </Switch>
    </BrowserRouter>
  );
}

上面代码中,使用了BrowserRouter包裹了多个Route,实现了路径的跳转功能。在BrowserRouter内部,会监听popstate方法处理浏览器地址的变化,再利用Route组件匹配对应的路径,最终渲染对应的组件。如果没有匹配到对应的路径,还可以使用Switch组件来设置默认路由。

2.3 路由传参

有些情况下,我们需要在路由之间传递参数,比如通过 URL 传递参数。react-router提供了两种方式传递参数:params 和 query。

2.3.1 params

使用 params 传参,通过路由路径中的占位符来传递参数。代码示例:

import React from 'react';
import { BrowserRouter, Route, Switch } from 'react-router-dom';

function App() {
  return (
    <BrowserRouter>
      <Switch>
        <Route path="/" exact={true} component={Home} />
        <Route path="/about/:id" component={About} />
        <Route path="/contact" component={Contact} />
      </Switch>
    </BrowserRouter>
  );
}

function About(props) {
  return (
    <div>
      <h1>这是about页面</h1>
      <p>接收到的参数是:{props.match.params.id}</p>
    </div>
  );
}

在上述代码中,我们在Route组件的路径中声明了一个占位符:id,用于接收传递的参数。而在About组件中,可以通过props.match.params.id获取到传递的参数。

2.3.2 query

使用 query 传参,通过 URL 查询字符串来传递参数。代码示例:

import React from 'react';
import { BrowserRouter, Link, Route, Switch } from 'react-router-dom';

function App() {
  return (
    <BrowserRouter>
      <Switch>
        <Route path="/" exact={true} component={Home} />
        <Route path="/about" component={About} />
        <Route path="/contact" component={Contact} />
      </Switch>
    </BrowserRouter>
  );
}

function About(props) {
  return (
    <div>
      <h1>这是about页面</h1>
      <Link to={`/about/detail?id=123`}>跳转到详情页</Link>
    </div>
  );
}

function Detail(props) {
  const query = new URLSearchParams(props.location.search);
  const id = query.get('id');

  return (
    <div>
      <h1>这是详情页</h1>
      <p>接收到的参数是:{id}</p>
      <Link to="/about">返回</Link>
    </div>
  );
}

在上述代码中,我们使用Link组件来传递参数,点击后会在 URL 中携带查询字符串id=123。在Detail组件中,通过props.location.search获取到查询字符串,并通过URLSearchParams对象来解析得到传递的参数。

3. 结语

以上是深入理解react-router路由的实现原理的攻略,希望能对你有所帮助。路由是一个前端项目不可或缺的一部分,掌握react-router的使用和原理,对于提高自己的技术水平具有很大的帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:深入理解react-router 路由的实现原理 - Python技术站

(0)
上一篇 2023年6月11日
下一篇 2023年6月11日

相关文章

  • JavaScript的防抖和节流一起来了解下

    JavaScript的防抖和节流一起来了解下 概念介绍 防抖和节流都是为了减少某些高频率事件的触发次数。在JavaScript中常用于优化性能或者提升用户体验。 防抖(debounce)指的是一段时间内重复触发同一事件,只执行一次函数的方法。可以使用定时器实现,如下代码所示: function debounce(fn, delay) { let timer …

    JavaScript 2023年6月11日
    00
  • js中函数调用的两种常用方法使用介绍

    JS中函数调用的两种常用方法是函数声明与函数表达式,下面我将对这两种方法进行介绍和举例子说明。 1. 函数声明 函数声明的形式如下: function functionName(parameters) { //函数体 } 其中,functionName 是函数名,parameters 是参数列表,函数体里面可以写任何合法的 JS 代码。函数声明完之后,我们可…

    JavaScript 2023年5月27日
    00
  • js中精确计算加法和减法示例

    JS中精确计算加法和减法可以使用第三方库BigDecimal.js进行操作。以下是完整攻略: BigDecimal.js 简介 BigDecimal.js官方文档:http://mikemcl.github.io/big.js/ 。该库从ECMAScript 5开始可以跨平台使用。该库通过兼容JavaScript中的Number类型来进行扩展和覆盖,返回精确…

    JavaScript 2023年6月10日
    00
  • 在页面中引入js的两种方法(推荐)

    在页面中引入JavaScript脚本有两种主要的方法,分别是通过script标签嵌入JavaScript代码和通过外部文件引入JavaScript代码。 嵌入JavaScript代码 要嵌入JavaScript代码,我们可以使用<script>标签来完成,在<script>标签中写入JavaScript代码,将其嵌入HTML页面即可。…

    JavaScript 2023年5月27日
    00
  • 浅谈javascript中的 “ && ” 和 “ || ”

    浅谈JavaScript中的 “&&” 和 “||” 在JavaScript中,逻辑运算符包括“与”(&&)、“或”(||)及“非”(!)三种,其中“与”和“或”经常被用来作为条件判断语句中的关键字。本篇文章将会详细讲解“与”(&&)和“或”(||)这两个运算符的用法以及其常见应用场景。 “与”(&&a…

    JavaScript 2023年5月17日
    00
  • 详解JavaScript时间处理之几个月前或几个月后的指定日期

    详解JavaScript时间处理之几个月前或几个月后的指定日期 在 JavaScript 中,我们常常需要对日期进行计算和处理,在实际业务开发中经常会遇到需要计算几个月前或几个月后的日期的需求。本篇文章将详细介绍怎样在 JavaScript 中实现这个功能。 1. 思路分析 为了计算 X 个月前或 X 个月后的日期,我们可以先将指定日期转换为时间戳,然后进行…

    JavaScript 2023年5月27日
    00
  • javascript实现很浪漫的气泡冒出特效

    “javascript实现很浪漫的气泡冒出特效”是一种比较流行的前端特效,它可以将一个固定位置的元素变成很多个气泡划分开,每个气泡都有自己特有的颜色、大小和浮动速度,使得整个页面看起来非常活泼、盎然。下面就让我们详细讲解如何实现这个特效。 准备工作 在前期准备工作中,我们需要引入一个定位元素,用来放置我们的气泡,还需要引入3种颜色、不同大小和速度的气泡。在引…

    JavaScript 2023年6月10日
    00
  • Date对象格式化函数代码

    下面是详细的“Date对象格式化函数代码”的攻略: 什么是Date对象 Date对象是JavaScript的内置对象之一,用于表示日期和时间,可以获取当前时间、创建指定日期时间的对象、设置日期时间等操作。该对象拥有一些常用的方法,例如getDate()、getFullYear()、getMonth()等,用于获取日期和时间中的具体值。 Date对象格式化函数…

    JavaScript 2023年6月10日
    00
合作推广
合作推广
分享本页
返回顶部