react-router-dom入门使用教程(前端路由原理)

目录
  • React路由相关理解
    • SPA的理解
    • 路由的理解
    • 前端路由原理(重点)
  • react-router-dom@5
    • 基本路由使用
    • 一般组件与路由组件
    • 路由API:Switch提高路由匹配效率(单一匹配)

React路由相关理解

SPA的理解

单页WEB应用(single page web application , SPA)。整个应用只有一个完整的页面。点击页面的链接不会刷新页面,只会做页面的局部更新数据都需要通过ajax请求获取,并在前端异步展现。

路由的理解

1. 什么是路由?

一个路由就是一个映射关系(key:value)

key为路径,value可能是function 或 component

2. 路由分类

后端路由:

  • 理解:value是 function ,用来处理客户端提交的请求。
  • 注册路由:router.get(path, function(request,response))
  • 工作过程:当node 接收到一个请求时,根据请求路径找到匹配的路由,调用路由中的函数来处理请求,返回响应数据。

前端路由:

  • 浏览器端路由 ,value 是 component,用于展示页面内容;
  • 注册路由:<Router path="/test” component={Test}>
  • 工作过程:当浏览器的 path 变为 /test时,当前路由组件就会变为 Test 组件

前端路由原理(重点)

前端路由依靠的是浏览器的BOM对象中的history,也就是浏览器的历史记录(history)。

但我们一般不直接操作BOM身上的history,而是借助history.js去操作BOM。

history模式的路由:

<script type="text/javascript" src="https://cdn.bootcss.com/history/4.7.2/history.js"></script>
<script type="text/javascript">
  let history = History.createBrowserHistory() //方法一,直接使用H5推出的history身上的API
</script>

hash模式的路由:(地址栏中带有 # 号)

<script type="text/javascript" src="https://cdn.bootcss.com/history/4.7.2/history.js"></script>
<script type="text/javascript">
  let history = History.createHashHistory() //方法二,hash值(锚点)
</script>

浏览器的历史记录(history)是一个栈的结构。

浏览器的历史记录(history)是一个栈的结构。

浏览器的历史记录(history)是一个栈的结构。

重要是事情说三遍。

每当执行push操作时,都是将path推入栈顶,浏览器也自动显示栈顶的内容。

function push(path) {  // path:/test1
  history.push(path)
  return false
}

此时栈中有着至少两条数据,栈底是:localhost:5500,栈顶是刚刚push进来的 localhost:5500/test1
浏览器会显示栈顶路径对应的路由界面。
执行浏览器的回退操作其实就是将栈顶的 “/test1”出栈。

而执行replace操作时,是将目前栈顶的元素替换。

function replace(path) {  // path: /test2
  history.replace(path)
}

若原栈顶是 /test1,执行replace后则将栈顶的 /test1替换为 /test2,且显示的是 /test2 的路由界面。

监听路由发生变化

history.listen(location => {
  console.log('请求路由路径变化了', location)
})

路由实现页面回退(将栈顶元素出栈)

history.goBack()

路由实现页面前进(将栈外元素推入栈顶)

history.goForward()

react-router-dom@5

  • react的一个插件库
  • 专门用来实现一个SPA应用
  • 基于 React 的项目基本都会用到此库。

下载react-router-dom

npm install react-router-dom@5
yarn add react-router-dom@5

️注意,本文讲解的是react-router-dom@5.3.3版本

基本路由使用

要实现图中案例,首先要先实现:(编写路由链接)
点击按钮实现路径跳转(也就是点击About,路径变为:localhost:3000/about)
然后实现:(注册路由)
路径变化后自动匹配响应的路由组件。(也就是路径为:/about时,自动匹配About组件)

import React, { Component } from 'react'
import { NavLink, Route } from 'react-router-dom'
import Home from './pages/Home'  // Home是路由组件
import About from './pages/About'  // About是路由组件
import Header from './components/Header'  // Header是一般组件
export default class App extends Component {
  render() {
    return (
      <div>
        <div className="row">
          <div className="col-xs-offset-2 col-xs-8">
            <Header />
          </div>
        </div>
        <div className="row">
          <div className="col-xs-2 col-xs-offset-2">
            <div className="list-group">
              {/* 原生html中靠<a>跳转不同的页面 */}
              {/* <a href="./about.html" rel="external nofollow"  className="list-group-item">About</a>
              <a href="./home.html" rel="external nofollow"  className="list-group-item">Home</a> */}

              {/* 在React中靠路由链接实现切换组件—-编写路由链接 */}
              <NavLink className="list-group-item" to="/about">About</NavLink>
              <NavLink className="list-group-item" to="/home">Home</NavLink>
            </div>
          </div>
          <div className="col-xs-6">
            <div className="panel">
              <div className="panel-body">
                {/* 注册路由 */}
                <Route path="/about" component={About} />
                <Route path="/home" component={Home} />
              </div>
            </div>
          </div>
        </div>
      </div>
    )
  }
}

这么写的话脚手架会报一个错误:

原因是,要在<NavLink>标签以及<Route>标签外面用<Router>标签包裹起来。
我们可以在index.js中完成这个需求:

// index.js
import React from 'react';
import ReactDOM from 'react-dom/client';
import { BrowserRouter as Router } from 'react-router-dom'
import App from './App';

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
  <React.StrictMode>
    <Router>
      <App />
    </Router>
  </React.StrictMode>
);

将整个App组件用Router标签包裹起来,这样就不会有报错啦。

一般组件与路由组件

路由组件与一般组件的不同:

路由组件放在 pages 文件夹中,一般组件放在 components 文件夹中;

路由组件使用:

import Home from './pages/Home'  // Home是路由组件
<Route path="/home" component={Home} />

一般组件使用:

import Header from './components/Header'  // Header是一般组件
<Header />

一般组件只要没传递props,那么组件的内部的this.props就一定为空。

哪怕没给路由组件传递props属性,路由组件内部的this.props并不为空。

原因是:路由组件会收到路由器自动传递给路由组件的props。

路由API:Switch提高路由匹配效率(单一匹配)

不加switch:

<div className="panel-body">
  {/* 注册路由 */}
  <Route path="/about" component={About} />
  <Route path="/home" component={Home} />
  <Route path='/home' component={Demo} />
</div>

注册路由时,不使用switch,两个组件同时匹配/home路径。

此时两个组件内容都会展示。

原因是:

注册路由时,与路径相匹配的路由组件都会展示,都会一一匹配。

使用switch:

<div className="panel-body">
  {/* 注册路由 */}
  <Switch>
    <Route path="/about" component={About} />
    <Route path="/home" component={Home} />
    <Route path='/home' component={Demo} />
  </Switch>
</div>

注册路由时,在外围包裹一组 Switch 标签,可以让路由实现单一匹配,也就是说,/home路径匹配到Home组件之后就不会再向下继续匹配了。这样的好处是,提高了路由匹配效率,如果不添加 Switch 标签,react路由会同一个路径查找多次,但是添加了 Switch 标签后,react路由只要查找到第一个与路径匹配的组件(如本例中的Home组件)就会结束查找,提高效率。

到此这篇关于react-router-dom入门使用教程的文章就介绍到这了,更多相关react-router-dom内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 详解react-router-dom v6版本基本使用介绍

    目录 Routes Route Navigate NavLink useRoutes 嵌套路由 路由传参 编程式导航 Routes 代替Switch组件,不会向下匹配 用来包裹Route Route 必须被Routes组件包裹 component属性变成element caseSensitive 路径大小写敏感属性,默认是不敏感(访问/about = /ABOUT) index 与path属性是互斥的,index表示为当前路由的根 可以用作layout组件,不写element属性,写了要与 Ou

  • react-router-dom入门使用教程(路由的模糊匹配与严格匹配)

    目录 模糊匹配 开启严格匹配 Redirect的使用 嵌套路由使用 模糊匹配 <!-- 编写路由链接 --> <NavLink to="/home/a/b">Home</NavLink> <!-- 注册路由 --> <Switch> <Route path="/home" component={Home} /> </Switch> 点击Home,进入路径/home/a/b,此时模糊匹

  • react-router-dom v6 通过outlet实现keepAlive 功能的实现

    本文主要介绍了react-router-dom v6 通过outlet实现keepAlive 功能的实现,具体如下: keepAlive代码: import React, { useRef, useEffect, useReducer, useMemo, memo } from 'react' import { TransitionGroup, CSSTransition } from 'react-transition-group' import { useLocation } from 'r

  • react-router-domV6版本的路由和嵌套路由写法详解

    目录 1-单级路由 2-嵌套路由(about路径进行嵌套) ReactRouterv6使用路由嵌套和重定向 1 - 单级路由 <NavLink to="/home">Home</NavLink> <NavLink to="/about">about</NavLink> <Routes>   <Route path='/home' element={<Home/>}/>   <R

  • react-router-dom6(对比 router5)快速入门指南

    目录 React Router 6 快速上手 1.概述 2.基本使用 3.重定向 4.NavLink高亮 5.useRoutes路由表 6.嵌套路由(Outlet) React Router 6 快速上手 在之前的文章中,我们已经学习了react-router-dom v5的内容,在react-router-dom v6版本中,对旧版本的API以及一些组件做了些许修改.本文开始,我将带大家学习最新的react-router-dom v6版本的路由知识,并且会与v5老版本进行一些对比. 需要学习r

  • react-router-dom V6的配置使用实践

    目录 一.关于书写方面 二.路由的嵌套方面优化 三.关于路由的灵活配置化 四.关于路由鉴权方面 最近在搭建PC项目的React框架,涉及到React Router,开发同学有时就需要去尝试点新的东西,在开发过程中才不会枯燥的,基于这个理念推动,就在搭建的时候用V6的版本开始了(虽然只是个新版本,也不算啥新东西)...... V6的版本相对于V5,做了很多的优化,有书写方面的.路由的嵌套.路由配置化.鉴权方面等等,下面就简单的介绍下如何使用 一.关于书写方面 路由注册的时候由的Switch改为了R

  • react-router-dom入门使用教程(前端路由原理)

    目录 React路由相关理解 SPA的理解 路由的理解 前端路由原理(重点) react-router-dom@5 基本路由使用 一般组件与路由组件 路由API:Switch提高路由匹配效率(单一匹配) React路由相关理解 SPA的理解 单页WEB应用(single page web application , SPA).整个应用只有一个完整的页面.点击页面的链接不会刷新页面,只会做页面的局部更新数据都需要通过ajax请求获取,并在前端异步展现. 路由的理解 1. 什么是路由? 一个路由就是

  • react router零基础使用教程

    目录 安装 配置路由 添加一个新页面测试路由 配置未找到的路由 跳转页面 通过 js 通过 dom 嵌套页面 安装 既然学习 react router 就免不了运行 react 安装 react npx create-react-app my-appcd my-appnpm start 安装 react router npm install react-router-dom 如果一切正常,就让我们打开 index.js 文件. 配置路由 引入 react-router-dom 的 RouterP

  • 详解SPA中前端路由基本原理与实现方式

    在讲前端路由之前,先说下后端路由,以及为什么出现了前端路由. 后端路由: 浏览器在地址栏中切换不同的url时,每次都向后台服务器发出请求,服务器响应请求,在后台拼接html文件传给前端显示,java web中的jsp就是如此实现的.常用的后台MVC模式的基本路由处理流程:浏览器输入一个url请求,从中找到Controller和Action的值,将请求传递给Controller处理,Controller获取Model数据对象,并且将Model传递给View,最后View呈现界面. 例如输入一个ur

  • 从vue-router看前端路由的两种实现

    随着前端应用的业务功能越来越复杂.用户对于使用体验的要求越来越高,单页应用(SPA)成为前端应用的主流形式.大型单页应用最显著特点之一就是采用前端路由系统,通过改变URL,在不重新请求页面的情况下,更新页面视图. "更新视图但不重新请求页面"是前端路由原理的核心之一,目前在浏览器环境中这一功能的实现主要有两种方式: 利用URL中的hash("#") 利用History interface在 HTML5中新增的方法 vue-router是Vue.js框架的路由插件,下

  • Vue 前端路由工作原理hash与history的区别

    目录 什么是路由? vue-router的工作原理 1.mode:'hash',在URL中会多'#' 2.mode:'history' 什么是路由? 路由分两种: 前端路由:Hash 地址与组件之间的对应关系 后端路由:浏览器 请求地址+请求方式 与 后端 业务逻辑 之间的一个映射关系 SPA与前端路由: SPA (单页面应用,全称为:Single-page Web applications) 指的是一个 web 网站只有唯一的一个 HTML 页面,所有组件的展示与切换都在这唯一的一个页面内完成

  • 使用React Router v6 添加身份验证的方法

    目录 开始 基础路由 创建受保护的路由 使用嵌套路由和< Outlet /> 结尾 React Router v6是React应用程序的一个流行且功能强大的路由库.它提供了一种声明式的.基于组件的路由方法,并能处理URL参数.重定向和加载数据等常见任务. 这个最新版本的React Router引入了很多新概念,比如<Outlet />和layout布局路由,但相关文档仍然很少. 本文将演示如何使用React Router v6创建受保护的路由以及如何添加身份验证. 开始 打开终端,

  • react hooks入门详细教程

    State Hooks 案例: import { useState } from 'react'; function Example() { const [count, setCount] = useState(0); //count:声明的变量:setCount:改变count值的函数:0:count的初始值 return ( <div> <p>You clicked {count} times</p> <button onClick={() => set

  • React中前端路由的示例代码

    目录 一. url是什么 二. 使用步骤 一. url是什么 访问不同url, 展示不同的组件 二. 使用步骤 安装React路由:命令行中执行npm install react-router-dom --save(注意此处的版本为npm install react-router-dom@4.3.1 --save) 两个js文件,分别为list.js和newButton.js,要实现访问localhost:3000/button的时候就显示button.js:访问localhost:3000/l

  • React前端路由应用介绍

    浏览器端的前端路由模式:hash模式,history模式 安装路由模块 路由模块不是react自带模块,需要安装第3方模块 // react-router-dom 它现在最新的版本6npm i -S react-router-dom@5 react-router-dom路由库,它路由相关的配置当作组件调用设置 一些相关组件 路由模式组件 包裹整个应用,一个React应用只需要使用一次 HashRouter: 使用URL的哈希值实现 (localhost:3000/#/first) Browser

  • react router 4.0以上的路由应用详解

    本文介绍了react router 4.0以上的路由应用,分享给大家,具体如下: 在4.0以下的react router中,嵌套的路由可以放在一个router标签中,形式如下,嵌套的路由也直接放在一起. <Route component={App}> <Route path="groups" components={Groups} /> <Route path="users" components={Users}> <Rou

随机推荐