当前位置: 首页 > news >正文

React@16.x(45)路由v5.x(10)源码(2)- history

目录

  • 1,作用
    • 1.1,createBrowserHistory
    • 1.2,createHashHistory
    • 1.3,createMemoryHistory
  • 2,history 对象的属性
    • 2.1,action
    • 2.2,push / replace / go / goBack / goForward
    • 2.3,location
    • 2.4,listen
    • 2.5,block / getUserConfirmation
    • 2.5,createHref

1,作用

react-router 在控制和监听地址变化时,使用的是第3方库 history,其中,

  • react-router v5.x,使用的 history v4.x版本
  • react-router v6.0.0,使用的 history v5.0版本

所以下面介绍的是 history v4.10.1 的 API,和 v5.0 是有差异的,注意区分。

另外,该对象不是 window.history,而是一个抽离的对象,它提供统一的 API 接口,封装了具体的实现。

  • createBrowserHistory,创建控制 浏览器真实地址history对象;
  • createHashHistory 创建控制 浏览器 hashhistory对象;
  • createMemoryHistory 创建控制 内存中地址栈history对象(一般用于没有地址栏的环境,比如 APP 中)。

它们3个共同的特点:

  • 维护了一个地址栈
  • 返回的 history 对象结构完全一致。

v5 版本,在使用下面3个方法时,已经没有配置项了。

1.1,createBrowserHistory

配置项:

  • basename:设置根路径。
  • forceRefresh:地址改变时是否强制刷新页面。
  • keyLength:location对象使用的 key 值长度。
    • 地址栈中记录的并非字符串,而是一个 location 对象。
  • getUserConfirmation:一个函数,该函数当调用 history.block()后,发生页面跳转时运行。

1.2,createHashHistory

配置项:

  • hashType#号后给定的路径格式(注意 # 后的内容)
    • hashbang:被chrome弃用,#!路径
    • noslash#a/b/c
    • slash#/a/b/c

1.3,createMemoryHistory

略。

2,history 对象的属性

官方API介绍

2.1,action

当前地址栈,最后一次操作的类型。(该属性没什么用)

  • 如果是通过 createXXXHistory 函数新创建的 history 对象,action 固定为 POP
  • 如果调用了 history.push()action 变为 PUSH;同理调用 history.replace(),会变为 REPLACE
  • 其他的 gogoForward 等方法,不会改变 action

只要是新创建historyaction 都是 POP
比如通过已创建的 history 执行了 push 操作,action 变为 PUSH。此时再次创建新的 history 对象,action 又会变为 POP

2.2,push / replace / go / goBack / goForward

这些顾名思义,不多赘述。

2.3,location

表示当前地址中的信息,包括的属性(和 react-router 中的一样):

{"pathname": "/","search": "","hash": "","state": null,"key": "xfadfd"
}

key 属性,是为了区分2个相同的地址。因为在地址栈中,存储的是 location 对象,通过 key 做唯一性判断。

2.4,listen

在之前的文章 React 路由守卫 中已经介绍了使用方式。
react-router 实现无刷新跳转的关键。

用于监听地址栈指针的变化。该函数接收一个函数作为参数,该参数表示地址变化后要做的事情

参数函数接收两个参数:

  • location:记录了新的地址信息;
  • action:进入新地址的方式:
    • POP:调用 gogoBackgoForward、用户点击浏览器后退按钮。
    • PUSH / REPLACE

该函数有一个返回值,返回的是一个函数,用于取消监听。

2.5,block / getUserConfirmation

同样的,在之前的文章 React 路由守卫 中已经介绍了使用方式。

block 用于设置一个阻塞,当页面发生跳转时,会将指定的消息传递到getUserConfirmation,并调用 getUserConfirmation 函数。

  • block 函数接收一个字符串作为参数,表示消息内容。也可以接收一个函数作为参数,函数的返回值是消息内容。
    该函数返回一个取消函数,调用取消函数可以解除阻塞。

2.5,createHref

返回一个可以直接作为 <a href=""> 的字符串,其实就是 bashname + url

const href= history.createHref(location);

以上。

相关文章:

React@16.x(45)路由v5.x(10)源码(2)- history

目录 1&#xff0c;作用1.1&#xff0c;createBrowserHistory1.2&#xff0c;createHashHistory1.3&#xff0c;createMemoryHistory 2&#xff0c;history 对象的属性2.1&#xff0c;action2.2&#xff0c;push / replace / go / goBack / goForward2.3&#xff0c;location2.…...

grpc学习golang版( 八、双向流示例 )

系列文章目录 第一章 grpc基本概念与安装 第二章 grpc入门示例 第三章 proto文件数据类型 第四章 多服务示例 第五章 多proto文件示例 第六章 服务器流式传输 第七章 客户端流式传输 第八章 双向流示例 文章目录 一、前言二、定义proto文件三、编写server服务端四、编写client客…...

SpringBoot学习05-[SpringBoot的嵌入式Servlet容器]

SpringBoot的嵌入式Servlet容器 嵌入式Servlet容器servlet容器-嵌入式servlet容器配置修改通过全局配置文件修改修改添加实现了WebServerFactoryCustomizer接口的bean来进行修改 servlet容器-注册servlet三大组件应该如何注册呢&#xff1f;servlet3.0规范提供的注解方式进行注…...

查看Oracle是哪个Oracle_home 下启动的

[rootrac1 ~]# ps -ef|grep smon root 413 24903 0 22:30 pts/0 00:00:00 grep --colorauto smon root 27165 1 0 22:11 ? 00:00:09 /u01/app/19.0.0/grid/bin/osysmond.bin grid 27784 1 0 22:12 ? 00:00:00 asm_smon_ASM1 oracl…...

重温react-06(初识函数组件和快速生成格式的插件使用方式)

开始 函数组件必然成为未来发展的趋势(个人见解),总之努力的去学习,才能赚更多的钱.加油呀! 函数组件的格式 import React from reactexport default function LearnFunction01() {return (<div>LearnFunction01</div>) }以上是函数式组件的组基本的方式 快捷生…...

【高考志愿】仪器科学与技术

目录 一、专业介绍 1.1 专业概述 1.2 专业方向 1.3 主要课程 二、专业技能与素质培养 三、就业前景 四、个人发展规划建议 五、仪器科学与技术专业排名 六、总结 一、专业介绍 1.1 专业概述 仪器科学与技术专业是一门综合性极强的学科&#xff0c;它融合了测量、控制…...

Elasticsearch的Mapping

Elasticsearch的Mapping Mapping是什么 Mapping定义了ES的索引结构、字段类型、分词器等&#xff0c;是索引的一部分。类似于关系型数据库中“表结构”的概念&#xff0c;在 Mapping 里也包含了一些属性&#xff0c;比如字段名称、类型、字段使用的分词器、是否评分、是否创建…...

【vocabulary in use (elementary)】6 Health and Illness

very well / fine 很好 ill sick 生病 I feel terrible 感觉很差 headache 头疼 toothache 牙疼 dentist medicine 药 pills 片药 caps 胶囊 aspirin 阿司匹林 antibiotic 抗生素 vitamin 维生素 painkiller 止痛药 dentist 牙医 got a cold 感冒 for many years 很多年 all th…...

探囊取物之多形式注册页面(基于BootStrap4)

基于BootStrap4的注册页面&#xff0c;支持手机验证码注册、账号密码注册 低配置云服务器&#xff0c;首次加载速度较慢&#xff0c;请耐心等候&#xff1b;演练页面可点击查看源码 预览页面&#xff1a;http://www.daelui.com/#/tigerlair/saas/preview/ly4gax38ub9j 演练页…...

【C++进阶学习】第五弹——二叉搜索树——二叉树进阶及set和map的铺垫

二叉树1&#xff1a;深入理解数据结构第一弹——二叉树&#xff08;1&#xff09;——堆-CSDN博客 二叉树2&#xff1a;深入理解数据结构第三弹——二叉树&#xff08;3&#xff09;——二叉树的基本结构与操作-CSDN博客 二叉树3&#xff1a;深入理解数据结构第三弹——二叉树…...

【RabbitMQ实战】Springboot 整合RabbitMQ组件,多种编码示例,带你实践 看完这一篇就够了

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、对RabbitMQ管理界面深入了解1、在这个界面里面我们可以做些什么&#xff1f; 二、编码练习&#xff08;1&#xff09;使用direct exchange(直连型交换机)&a…...

【你也能从零基础学会网站开发】理解DBMS数据库管理系统架构,从用户到数据到底经历了什么

&#x1f680; 个人主页 极客小俊 ✍&#x1f3fb; 作者简介&#xff1a;程序猿、设计师、技术分享 &#x1f40b; 希望大家多多支持, 我们一起学习和进步&#xff01; &#x1f3c5; 欢迎评论 ❤️点赞&#x1f4ac;评论 &#x1f4c2;收藏 &#x1f4c2;加关注 其实前面我们也…...

Vue.js 中的API接口封装实战与详解

在开发Web应用的过程中&#xff0c;我们常常需要和服务器进行数据交互&#xff0c;这就涉及到了API接口的调用。在Vue.js项目中&#xff0c;为了提高代码复用性、可维护性和降低错误率&#xff0c;我们将API接口进行合理的封装显得尤为重要。本文将详细介绍如何在Vue.js项目中实…...

职场内卷、不稳定、没前景……怎么破?

经济下行期&#xff0c;大家普遍反映混职场艰难。 再深究下&#xff0c;发现造成职场艰难的原因主要有三个&#xff1a; 1.内卷&#xff1a;狼多肉少 2.不稳定&#xff1a;裁员总是不期而遇 3.没前景&#xff1a;明知过几年会被优化&#xff0c;但无法改变&#xff0c;死气沉沉…...

LeetCode 算法:将有序数组转换为二叉搜索树 c++

原题链接&#x1f517;&#xff1a;将有序数组转换为二叉搜索树 难度&#xff1a;简单⭐️ 题目 给你一个整数数组 nums &#xff0c;其中元素已经按 升序 排列&#xff0c;请你将其转换为一棵 平衡 二叉搜索树。 示例 1&#xff1a; 输入&#xff1a;nums [-10,-3,0,5,9]…...

智慧公厕系统改变了人们对服务区公厕的看法

在过去&#xff0c;服务区公厕常常给人留下脏乱差的印象&#xff0c;成为人们在长途旅行途中不愿停留的地方。然而&#xff0c;随着智慧科技的不断发展和应用&#xff0c;智慧公厕系统的出现改变了人们对服务区公厕的看法&#xff0c;为公共卫生设施的提升注入了新的活力。 一、…...

终极指南:RNNS、Transformers 和 Diffusion 模型

一、说明 作为广泛使用这些工具和模型的人&#xff0c;我的目标是解开 RNN、Transformer 和 Diffusion 模型的复杂性和细微差别&#xff0c;为您提供详细的比较&#xff0c;为您的特定需求提供正确的选择。 无论您是在构建语言翻译系统、生成高保真图像&#xff0c;还是处理时间…...

WPF UI 3D 基本概念 点线三角面 相机对象 材质对象与贴图 3D地球 光源 变形处理 动作交互 辅助交互插件 系列三

WPF UI交互专题 平面图形 Path Drawing 绘图 渐变 Brush 矩阵 Transform 变形 阴影效果 模糊效果 自定义灰度去色效果 系列二-CSDN博客 1软件中的3D基本概念 WPF 中 3D 功能的设计初衷并非提供功能齐全的游戏开发平台。 WPF 中的 3D 图形内容封装在 Viewport3D 元素中&#x…...

分子AI预测赛Task2笔记

下面所述比较官方的内容都来自官方文档 ‍‌⁠‌‍​​​‌​​⁠​​​​​&#xfeff;​​​&#xfeff;‍‬​​‍⁠‍‍​​‬​&#xfeff;‌​​​‌‍‬​​​​​​‍‌Task2&#xff1a;赛题深入解析 - 飞书云文档 (feishu.cn) 赛题背景 强调了人工智能在科研领域&…...

剖析DeFi交易产品之UniswapV4:创建池子

本文首发于公众号&#xff1a;Keegan小钢 创建池子的底层函数是 PoolManager 合约的 initialize 函数&#xff0c;其代码实现并不复杂&#xff0c;如下所示&#xff1a; function initialize(PoolKey memory key, uint160 sqrtPriceX96, bytes calldata hookData)externalover…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合

强化学习&#xff08;Reinforcement Learning, RL&#xff09;是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程&#xff0c;然后使用强化学习的Actor-Critic机制&#xff08;中文译作“知行互动”机制&#xff09;&#xff0c;逐步迭代求解…...

【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表

1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

HDFS分布式存储 zookeeper

hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架&#xff0c;允许使用简单的变成模型跨计算机对大型集群进行分布式处理&#xff08;1.海量的数据存储 2.海量数据的计算&#xff09;Hadoop核心组件 hdfs&#xff08;分布式文件存储系统&#xff09;&a…...

动态 Web 开发技术入门篇

一、HTTP 协议核心 1.1 HTTP 基础 协议全称 &#xff1a;HyperText Transfer Protocol&#xff08;超文本传输协议&#xff09; 默认端口 &#xff1a;HTTP 使用 80 端口&#xff0c;HTTPS 使用 443 端口。 请求方法 &#xff1a; GET &#xff1a;用于获取资源&#xff0c;…...

深入浅出Diffusion模型:从原理到实践的全方位教程

I. 引言&#xff1a;生成式AI的黎明 – Diffusion模型是什么&#xff1f; 近年来&#xff0c;生成式人工智能&#xff08;Generative AI&#xff09;领域取得了爆炸性的进展&#xff0c;模型能够根据简单的文本提示创作出逼真的图像、连贯的文本&#xff0c;乃至更多令人惊叹的…...

数据结构:递归的种类(Types of Recursion)

目录 尾递归&#xff08;Tail Recursion&#xff09; 什么是 Loop&#xff08;循环&#xff09;&#xff1f; 复杂度分析 头递归&#xff08;Head Recursion&#xff09; 树形递归&#xff08;Tree Recursion&#xff09; 线性递归&#xff08;Linear Recursion&#xff09;…...

字符串哈希+KMP

P10468 兔子与兔子 #include<bits/stdc.h> using namespace std; typedef unsigned long long ull; const int N 1000010; ull a[N], pw[N]; int n; ull gethash(int l, int r){return a[r] - a[l - 1] * pw[r - l 1]; } signed main(){ios::sync_with_stdio(false), …...

精益数据分析(98/126):电商转化率优化与网站性能的底层逻辑

精益数据分析&#xff08;98/126&#xff09;&#xff1a;电商转化率优化与网站性能的底层逻辑 在电子商务领域&#xff0c;转化率与网站性能是决定商业成败的核心指标。今天&#xff0c;我们将深入解析不同类型电商平台的转化率基准&#xff0c;探讨页面加载速度对用户行为的…...

SQLSERVER-DB操作记录

在SQL Server中&#xff0c;将查询结果放入一张新表可以通过几种方法实现。 方法1&#xff1a;使用SELECT INTO语句 SELECT INTO 语句可以直接将查询结果作为一个新表创建出来。这个新表的结构&#xff08;包括列名和数据类型&#xff09;将与查询结果匹配。 SELECT * INTO 新…...

codeforces C. Cool Partition

目录 题目简述&#xff1a; 思路&#xff1a; 总代码&#xff1a; https://codeforces.com/contest/2117/problem/C 题目简述&#xff1a; 给定一个整数数组&#xff0c;现要求你对数组进行分割&#xff0c;但需满足条件&#xff1a;前一个子数组中的值必须在后一个子数组中…...