React 如何进行路由变化监听

news2025/1/7 22:13:57

一、使用`react-router`库(以`react-router-dom`为例)

1. 历史(`history`)对象监听

1.1 原理

`react-router`内部使用`history`对象来管理路由历史记录。可以通过访问`history`对象来监听路由变化。在基于类的组件中,可以通过组件的`props`获取`history`对象;在函数式组件中,可以使用`useHistory`钩子函数获取。

1.2 示例(基于类的组件)

import React from "react";

import { withRouter } from "react-router-dom";

class MyComponent extends React.Component {

  componentDidMount() {

    this.props.history.listen((location, action) => {

      console.log("路由发生变化,新位置:", location);

      console.log("路由变化的动作:", action);

    });

  }

  render() {

    return <div>这是一个组件</div>;

  }

}

export default withRouter(MyComponent);

在这里,`componentDidMount`生命周期方法中,通过`this.props.history.listen`来添加一个路由变化的监听器。每当路由发生变化时,就会打印出新的位置(`location`)和路由变化的动作(`action`,如`PUSH`、`REPLACE`等)。

1.3 示例(函数式组件)

import React from "react";

import { useHistory } from "react-router-dom";

function MyComponent() {

  const history = useHistory();

  React.useEffect(() => {

    const unlisten = history.listen((location, action) => {

      console.log("路由发生变化,新位置:", location);

      console.log("路由变化的动作:", action);

    });

    return () => {

      unlisten();

    };

  }, [history]);

  return <div>这是一个函数式组件</div>;

}

export default MyComponent;

在函数式组件中,使用`useHistory`钩子获取`history`对象,然后在`useEffect`钩子中添加监听器。同时,返回一个清理函数,用于在组件卸载时移除监听器。

2. `useLocation`钩子监听(推荐用于函数式组件)

2.1 原理

`useLocation`是`react-router-dom`提供的一个钩子函数,它返回当前的`location`对象。通过比较前后`location`对象的变化,可以检测到路由是否发生了变化。

2.2 示例

import React from "react";

import { useLocation } from "react-router-dom";

function MyComponent() {

  const location = useLocation();

  React.useEffect(() => {

    console.log("当前路由位置:", location);

  }, [location]);

  return <div>这是一个函数式组件</div>;

}

export default MyComponent;

在这里,`useEffect`钩子依赖`location`对象。每当`location`发生变化(即路由变化)时,`useEffect`中的回调函数就会被执行,打印出当前的路由位置。

3. 自定义事件监听(不依赖`react-router`内部机制)

3.1 原理

在顶层组件(如`App`组件)中,通过`window`对象的`addEventListener`方法监听`hashchange`(对于哈希路由)或`popstate`(对于 HTML5 历史记录路由)事件来检测路由变化。这种方法比较底层,需要自己处理更多的细节,比如区分不同类型的路由和处理事件冒泡等问题。

3.2 示例(以哈希路由为例)

import React from "react";

function App() {

  React.useEffect(() => {

    const handleHashChange = () => {

      console.log("哈希路由发生变化,当前哈希:", window.location.hash);

    };

    window.addEventListener("hashchange", handleHashChange);

    return () => {

      window.removeEventListener("hashchange", handleHashChange);

    };

  }, []);

  return <div>{/* 路由相关组件和内容 */}</div>;

}

export default App;

在`App`组件的`useEffect`钩子中,添加了一个`hashchange`事件监听器。当哈希路由发生变化时,就会打印出当前的哈希值。注意,在返回的清理函数中,要移除添加的监听器,以避免内存泄漏。

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

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

相关文章

基于Python的考研学习系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

计算机网络 —— 网络编程(TCP)

计算机网络 —— 网络编程&#xff08;TCP&#xff09; TCP和UDP的区别TCP (Transmission Control Protocol)UDP (User Datagram Protocol) 前期准备listen &#xff08;服务端&#xff09;函数原型返回值使用示例注意事项 accpect &#xff08;服务端&#xff09;函数原型返回…

Vue 项目自动化部署:Coding + Jenkins + Nginx 实践分享

前言 本文详细记录如何使用 Coding (以 Jenkinsfile 为核心) 和 Nginx 部署 Vue 项目&#xff0c;包含完整流程、配置细节及注意事项&#xff0c;为开发者提供一个高效的实践参考。 准备工作 这里借用一个优秀的开源项目做演示&#xff1a;芋道源码/yudao-ui-admin-vue2。 以…

Mysql运维利器之备份恢复-xtrabackup 安装

1、插件下载 xtrabackup 下载地址 找到自己mysql版本对应得 插件版本下载 2、执行安装命令 yum localinstall percona-xtrabackup-80-8.0.26-18.1.el7.x86_64.rpm 安装完毕&#xff01;查看版本信息 xtrabackup --version 安装完毕&#xff01;&#xff01;&#xff01;

【JAVA】神经网络的基本结构和前向传播算法

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c; 忍不住分享一下给大家。点击跳转到网站 学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……&#xff09; 2、学会Oracle数据库入门到入土用法(创作中……&#xff09; 3、手把…

ip属地的信息准确吗?ip归属地不准确怎么办

在数字化时代&#xff0c;IP属地信息成为了我们日常生活中不可或缺的一部分。在各大社交媒体平台上&#xff0c;IP属地信息都扮演着重要的角色。然而&#xff0c;随着技术的不断进步和网络的复杂性增加&#xff0c;IP属地信息的准确性问题也日益凸显。那么&#xff0c;IP属地信…

Flask----前后端不分离-登录

文章目录 扩展模块flask-wtf 的简单使用定义用户数据模型flask-login完成用户登录 扩展模块 flask-sqlalchmy&#xff0c;连接数据库flask-login&#xff0c;处理用户的登录&#xff0c;认证flask-session&#xff0c;会话保持&#xff0c;默认对用户数据加密&#xff0c;存储…

[读书日志]从零开始学习Chisel 第一篇:书籍介绍,Scala与Chisel概述,Scala安装运行(敏捷硬件开发语言Chisel与数字系统设计)

简介&#xff1a;从20世纪90年代开始&#xff0c;利用硬件描述语言和综合技术设计实现复杂数字系统的方法已经在集成电路设计领域得到普及。随着集成电路集成度的不断提高&#xff0c;传统硬件描述语言和设计方法的开发效率低下的问题越来越明显。近年来逐渐崭露头角的敏捷化设…

计算机网络掩码、最小地址、最大地址计算、IP地址个数

一、必备知识 1.无分类地址IPV4地址网络前缀主机号 2.每个IPV4地址由32位二进制数组成 3. /15这个地址表示网络前缀有15位&#xff0c;那么主机号32-1517位。 4.IP地址的个数&#xff1a;2**n (n表示主机号的位数) 5.可用&#xff08;可分配&#xff09;IP地址个数&#x…

【阅读笔记】基于FPGA的红外图像二阶牛顿插值算法的实现

图像缩放技术在图像显示、传输、分析等多个领域中扮演着重要角色。随着数字图像处理技术的发展&#xff0c;对图像缩放质量的要求也越来越高。二阶牛顿插值因其在处理图像时能够较好地保持边缘特征和减少细节模糊&#xff0c;成为了图像缩放中的一个研究热点。 一、 二阶牛顿插…

计算机毕业设计Python电商品推荐系统 商品比价系统 电商比价系统 商品可视化 商品爬虫 机器学习 深度学习 京东爬虫 国美爬虫 淘宝爬虫 大数据

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

BBP飞控板中的坐标系变换

一般飞控板中至少存在以下坐标系&#xff1a; 陀螺Gyro坐标系加速度计Acc坐标系磁强计Mag坐标系飞控板坐标系 在BBP飞控板采用的IMU为同时包含了陀螺&#xff08;Gyro&#xff09;及加速度计&#xff08;Acc&#xff09;的6轴传感器&#xff0c;故Gyro及Acc为同一坐标系。同时…

企业网络综合组网

1 概述 2 网络需求分析 2.1企业需求分析 公司规模 员工规模&#xff1a;200人&#xff0c;其中包括技术研发人员&#xff0c;市场营销人员&#xff0c;运营管理人员&#xff0c;客户服务人员等。部门数量&#xff1a;19个部门&#xff0c;包括财务部&#xff0c;人力资源部…

【沉默的羔羊心理学】汉尼拔的“移情”游戏:操纵与理解的艺术,精神分析学视角下的角色互动

终极解读《沉默的羔羊》&#xff1a;弗洛伊德精神分析学视角下的深层剖析 关键词 沉默的羔羊弗洛伊德精神分析学角色心理意识与潜意识性别与身份 弗洛伊德精神分析学简介 弗洛伊德的精神分析学是心理学的一个重要分支&#xff0c;主要关注人类行为背后的无意识动机和冲突。…

Qt窗口获取Tftpd32_svc服务下载信息

前言 一个由Qt开发的Windows小工具需要布置Tftp协议服务端来支持设备下载数据&#xff0c;并显示下载列表&#xff08;进度、下载源等&#xff09;。 考虑开发方便&#xff0c;优先使用了Qtftp方案&#xff0c;经测试发现&#xff0c;不够稳定&#xff0c;会有下载超时的情况&a…

合合信息亮相CSIG AI可信论坛,全面拆解AI视觉内容安全的“终极防线”

合合信息亮相CSIG AI可信论坛&#xff0c;全面拆解视觉内容安全的“终极防线”&#xff01; &#x1f42f; AI伪造泛滥&#xff0c;我们还能相信“眼见为实”吗&#xff1f; 近期&#xff0c;由中国图象图形学学会主办的CSIG青年科学家会议 AI可信论坛在杭州成功举办。本次论…

Bash Shell的操作环境

目录 1、路径与指令搜寻顺序 2、bash的进站&#xff08;开机&#xff09;与欢迎信息&#xff1a;/etc/issue&#xff0c;/etc/motd &#xff08;1&#xff09;/etc/issue &#xff08;2&#xff09;/etc/motd 3、bash的环境配置文件 &#xff08;1&#xff09;login与non-…

如何在没有 iCloud 的情况下将联系人从 iPhone 传输到 iPhone

概括 近期iOS 13.5的更新以及苹果公司发布的iPhone SE在众多iOS用户中引起了不小的轰动。此外&#xff0c;不少变化&#xff0c;如暴露通知 API、Face ID 增强功能以​​及其他在 COVID-19 期间与公共卫生相关的新功能&#xff0c;吸引了 iPhone 用户尝试新 iPhone 并更新到最…

网站设计总结后期维护与更新的重要性

当我们谈论网站设计时&#xff0c;往往会聚焦在初始阶段的创意和实现上。然而&#xff0c;一旦网站建成并上线&#xff0c;后期维护与更新的重要性就显得尤为突出。一个网站的成功不仅取决于其初始设计&#xff0c;更在于持续的维护与更新。 首先&#xff0c;后期维护能够确保网…

Android NDK开发实战之环境搭建篇(so库,Gemini ai)

文章流程 音视频安卓开发首先涉及到ffmpeg编译打包动态库&#xff0c;先了解动态库之间的cpu架构差异性。然后再搭建可运行的Android 环境。 So库适配 ⽇常开发我们经常会使⽤到第三库&#xff0c;涉及到底层的语⾳&#xff0c;视频等都需要添加so库。⽽so库的体积⼀般来说 ⾮…