监听react-router路由的变化_react监听路由变化-程序员宅基地

技术标签: react-router-watcher  react路由监听  前端  react  React  

我们有时候会遇到这种业务场景: 进入某个页面时,我们需要验证用户是否已经登陆,是否拥有足够权限?我们可以通过监听路由的变化来实现。但是在react下,怎么实现呢?

下面讨论实现过程:

  1. 手动实现
  2. react-router-watcher实现, 详细请见示例代码

手动实现

使用Hook方式实现:

import {
   
     useEffect, useState, useRef, useCallback, useMemo } from 'react'
import {
   
     useLocation, useHistory, useRouteMatch } from 'react-router'

const useWatcher = () => {
   
    
  const location = useLocation()
  const history = useHistory()
  const match = useRouteMatch()
  const [pathname, setPathname] = useState('')
  const listeners = useRef([])
  

  const addListener = useCallback((listener) => {
   
    
    listeners.current.push(listener)
  }, [])

  const removeListener = useCallback((listener) => {
   
    
    const index = listeners.current.findIndex(item => item === listener)
    if (index >= 0) {
   
    
      listeners.current.splice(index, 1)
    }
  }, [])

  const execListeners = useCallback(() => {
   
    
    listeners.current.forEach(func => {
   
    
      func({
   
    
        history,
        match,
        location
      })
    })

  }, [history, match, location])

  useEffect(() => {
   
    
    if (pathname !== location.pathname) {
   
    
      execListeners()
      setPathname(pathname)
    }
  }, [location, execListeners, pathname])

  const watcher = useMemo(() => {
   
    
    return {
   
    
      removeListener, addListener
    }
  }, [removeListener, addListener])

  return watcher
}
export default useWatcher

使用react类实现:

import React, {
   
     Component } from 'react'
import {
   
     withRouter 
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/mmzzll2019/article/details/116572844

智能推荐

【stable diffusion LORA训练】改进lora-scripts,命令行方式训练LORA,支持SDXL训练-程序员宅基地

文章浏览阅读1.5k次,点赞5次,收藏9次。分享下自己改进的一个lora训练脚本,在ubuntu下如果SD-WEBUI的环境已经搭好的话,只需要下载lora-script就可以支持训练了,直接命令行方式训练_lora-scripts

Android AndroidManifest 清单文件以及权限详解_清单文件的哪一节指定当用户尝试获取未缓存文件时将执行的任务-程序员宅基地

文章浏览阅读1.8k次。每个Android应用都需要一个名为AndroidManifest.xml的程序清单文件,这个清单文件名是固定的并且放在每个Android应用的根目录下。它定义了该应用对于Android系统来说一些非常重要的信息。Android系统需要这些信息才能正常运行该应用。Android程序清单文件主要具有下面作用:· 它给应用程序Java包命名,这个包名作为应用程序唯一标识符。_清单文件的哪一节指定当用户尝试获取未缓存文件时将执行的任务

Java中的Timer源码分析及缺陷_java timer自己会丢失吗-程序员宅基地

文章浏览阅读3.7k次。使用Timer执行定时任务很简单,一般这样子写: Timer timer = new Timer(); TimerTask task = new TimerTask() { @Override public void run() { System.out.println("hel_java timer自己会丢失吗

蒙特卡洛之三门问题_n次蒙提霍尔问题matlab-程序员宅基地

文章浏览阅读1.7k次,点赞4次,收藏14次。【何为三门问题?】三门问题(Monty Hall problem)亦称为蒙提霍尔问题、蒙特霍问题或蒙提霍尔悖论,大致出自美国的电视游戏节目Let’s Make a Deal。问题名字来自该节目的主持人蒙提·霍尔(Monty Hall)。参赛者会看见三扇关闭了的门,其中一扇的后面有一辆汽车,选中后面有车的那扇门可赢得该汽车,另外两扇门后面则各藏有一只山羊。当参赛者选定了一扇门,但未去开启它的时候,..._n次蒙提霍尔问题matlab

java system load_Java:System.loadLibrary()的使用方法汇总-程序员宅基地

文章浏览阅读2.2k次。转自http://blog.csdn.net/forandever/article/details/5983846当使用System.loadLibrary()调用 Dll,两种方法:1.设定环境变量。比如:所编辑的Dll在目录“D:/cppProjects/nativecode/release”内,将这个路径复制添加到电脑的环境变量中的path变量内即可。2.设定项目属性。(开发推荐)右击项目名..._java system.loadlibrary

linux连接小米随身wifi密码忘记了,小米随身wifi设置教程-程序员宅基地

文章浏览阅读351次。摘 要原标题:"小米随身wifi怎么用 小米随身wifi设置图文教程"相关路由器设置经验分享。 - 来源:路由器之家作为小米送给米粉们的新年“礼物”——小米"原标题:"小米随身wifi怎么用 小米随身wifi设置图文教程"相关路由器设置经验分享。 - 来源:【路由器之家】作为小米送给米粉们的新年“礼物”——小米随身wifi在12月25日发布,这是一款同360随身wifi、小度wifi一样的硬件设备..._linux 小米随身wifi

随便推点

服务器修改开机启动项,启动项设置_服务器开机启动项-程序员宅基地

文章浏览阅读8.2k次。最近很多观众老爷在苦觅关于启动项设置的解答,今天钦编为大家综合5条解答来给大家解开疑惑! 有98%玩家认为启动项设置_服务器开机启动项值得一读!启动项设置1.如何在bios设置硬盘为第一启动项详细步骤根据BIOS分类的不同操作不同:一、AMI BIOS 或Phoenix BIOS 通用设置1、以联想机型为例,启动时按Del或F1进入BIOS,切换到Boot界面,选择1st Boot Device回..._服务器bios启动项设置

鸿蒙os手机版正式版官方,亿万花粉有福了!鸿蒙手机OS正式版将于3月上线,或由P50系列首发...-程序员宅基地

文章浏览阅读116次。受制裁影响,华为手机的市场份额不断下滑。根据最新的数据,2021年1月,华为手机在国内的市场份额不低OPPO和vivo,仅名列第三。虽然困难重重,华为却未停止往前走的脚步,还开除了几名在网上声称“华为要出售手机业务”的内部员工。华为官方已经确认,新款手机还会正常发布,按照发布节奏,上半年的旗舰—P50系列已经离我们是越来越近了。P50系列除了会带来更加出色的拍照,还有一大绝招,那就有可能会首发鸿蒙..._鸿蒙手机版正式上线

npm默认安装路径设置_npm默认路径-程序员宅基地

文章浏览阅读1.6w次,点赞2次,收藏12次。默认情况下,在哪个文件夹下运行npm,npm就在当前目录创建一个文件夹node_modules,然后将要安装的程序安装到文件夹node_modules里面,这样我很不习惯哈。。。所以让我们给它设置一个默认位置吧!// 设置npm安装程序时的默认位置npm config set prefix “C:\Users\Default\AppData\Roaming\npm\node_modules”..._npm默认路径

初玩dlib:人脸识别(2)_shape_predictor_68_face_landmarks-程序员宅基地

文章浏览阅读512次。1. 简介利用训练好的 shape_predictor_68_face_landmarks.dat(人脸 68 点特征检测器),进行人脸面部轮廓特征的提取。下载地址:http://dlib.net/files/shape_predictor_68_face_landmarks.dat.bz22. 代码 face_landmark_detector_remark.py# -*-..._shape_predictor_68_face_landmarks

三维空间中向量的旋转_三维向量旋转-程序员宅基地

文章浏览阅读9.2k次,点赞9次,收藏41次。三维空间中向量的旋转_三维向量旋转

MATLAB:三维坐标及函数案例实现_matlab建立三维坐标系-程序员宅基地

文章浏览阅读1.4w次,点赞6次,收藏43次。虚拟现实技术:三维立体显示案例实现目录虚拟现实技术:三维立体显示案例实现案例一:matlab 绘制三维图并标注每个点的坐标1.前言2.代码实现案例二:matlab 绘制三维曲面的函数1.mesh函数2.surf函数3.两者调用格式差不多4.比较mesh、surf的区别案例一:matlab 绘制三维图并标注每个点的坐标1.前言基本原理是先绘制三维图,通过plot3,然后通过text函数在每个点标注出坐标,但由于点的数量多,标注会比较密集,不一定看得清楚,可以适当减少标注的点数来提高清晰度。2.代码实_matlab建立三维坐标系

推荐文章

热门文章

相关标签