前言: 最近在做项目时候,遇到了返回时候如果用户没有保存表单,需要拦截路由跳转,并给出提示信息是否要退出。相信做过vue项目的小伙伴都对vue的路由守卫并不陌生,react中如何实现呢?(本分享是针对react-router的v5版本)

一、使用Prompt组件来完成

闲话不多说直接上干货,react-router包里边给我们提供了一个组件,来帮助我们完成路由守卫。它有两个参数when和message。

参数名称 类型 作用
when boolean true 弹窗
false顺利跳转
message function或者字符串 函数返回true就顺利跳转,false停止跳转
字符串就弹窗字符串并停止跳转。
when值 message值 路由是否跳转 是否弹出默认框
false 无论message是函数返回任何值还是message是字符串后边结果都一样
true message是字符串
true message是函数返回值true
true message是函数返回值是字符串
true message是函数返回false

由于默认弹窗非常不好看,所以,要借助antd或者meet-react来美化弹框。通过上边表格值可知,当when值是true并且message是函数返回值为false时候,才会拦截路由同时,不会弹出默认弹出框。话不多说,直接上实例代码:

import {  Dialog } from '@alifd/meet-react';
import React, { useEffect, useState} from 'react';
import { Prompt, useHistory } from 'react-router';import style from './index.module.scss';export default function TestPage() {const history = useHistory();const [notAllowJump, setNotAllowJump] = useState(true);/*** 路由拦截* @param {*} location string* @returns boolean*/function handleRouter() {const list = field.getValue('list');const equal = xxxxx(); // 判断两次值是不是一样 if (equal) {// 两次值一样,用户没改动数据,直接放行return true;}Dialog.show({centered: true,content: '是否保存当前修改数据',onOk() {// 用户需要提交,提交后要放行,先将when置为false,再提交操作setNotAllowJump(false);xxxxxSubmit(); // 继续提交},async onCancel() {// 用户不提交,直接放弃修改返回上一页。将when置为false再返回,注意setNotAllowJump操作是异步的。await setNotAllowJump(false);history.goBack();},});// 用户有修改,返回false拦截跳转,同时屏蔽掉默认弹出框return false;}return (<div className={style['test-page']}><Prompt when={notAllowJump} message={handleRouter} /><footer>我是页面内容</footer></div>);
}

二、使用history.block拦截

block返回值 路由是否跳转 是否弹出默认框
true
false
string

通过观察返回值不难发现当block返回值是false时候,能够拦截路由跳转,并且不会弹出默认提示框。

import { useHistory } from 'react-router';
import {  Dialog } from '@alifd/meet-react';
import React, { useEffect, useState} from 'react';import style from './index.module.scss';export default function TestPage() {const history = useHistory();useEffect(() => {history.block(() => {Dialog.show({centered: true,content: '是否保存当前修改数据',onOk() {history.block(() => true); // 放开拦截提交操作,成功后在提交函数内跳出去xxxxxSubmit();},async onCancel() {history.block(() => true);history.goBack();},});// 开启路由拦截同时阻止默认弹出框return false;});}, [history]);return (<div className={style['test-page']}><footer>我是页面内容</footer></div>);
}

react路由拦截(路由守卫)相关推荐

  1. 路由导航守卫/路由拦截/导航守卫

    导航守卫: 又称:路由导航守卫.路由拦截都是一样的 分为全局守卫.组件守卫.独享守卫 全局守卫 写在路由页面,写在const router同级之下 const router = new VueRout ...

  2. 2022-11-15 vue笔记-路由vue-router(四) 路由守卫(又称路由拦截,导航守卫)的定义以及示例

    文章目录 0.路由的概念 1.路由守卫的定义 定义 官方解释 路由守卫的分类 钩子函数 2.路由守卫的使用场景 3.语法:`router.beforeEach((to,from,next) => ...

  3. react登录页面_React 实现路由拦截

    接到个新项目,使用的是React,由于React没有属于自己的路由拦截方法,只有自己封装Route成高阶组件来实现,现记录下实现的方式: 首先创建一个router文件,引入项目需要展示的组件 . ex ...

  4. react离开页面,自定义弹框拦截,路由拦截

    前言: 项目有个需求是:跳转路由,在离开页面前,需要弹框询问用户是否确定离开. 用react-router的<Prompt>组件是可以的,但是,怎么使用antd组件(或者说自定义组件)呢? ...

  5. 路由导航守卫和路由拦截

    1.如果用户没有登录,但是直接通过URL访问特定网页,需要重新导航到登录页面 router.beforeEach(( to, from , next ) => { //如果用户访问的登录页,直接 ...

  6. 全局前置守卫--路由拦截

    / 全局前置守卫 ---> 进行路由拦截 router.beforeEach( (to, from, next) => { if(to.path == "/login" ...

  7. 路由守卫 /路由拦截

    1. 在访问一个页面的时候 也就是在进行路由跳转的时候,把这个跳转拦下来 做一些判断或者操作 然后来执行是继续访问这个页面还是执行别的操作 路由的导航守卫又叫 路由的生命周期函数 也叫 路由的钩子函数 ...

  8. 前后端分离,如何解决跨域(代理模式)、路由拦截(进入页面需要登录)以及请求拦截(登录TOKEN失效)等问题(初学者)

    前端时间项目需要发布一个较大的版本,工作比较忙,加了好多个晚上的班,感觉自己有点缺氧了.最近稍微闲下来了,顺便调休了三天,刚刚给家里来了个大扫除,看着这干干净净的小家,心里顿时舒服了很多. 下面进入正 ...

  9. vue 定义全局弹框_VUE路由拦截:Vue自定义全局弹窗组件

    前言 在任何一个平台中,如果需要增加用户黏度,除了用户需要的基本内容外,用户登录注册提交信息也是非常重要的一环,可以了解用户基本信息,用户喜欢等. 抛出前后端混合开发外,vue可以轻松的实现路由拦截. ...

最新文章

  1. php基础:switch cass控制结构 代替if
  2. 立足自主可控 斩获财政局虚拟化大单
  3. 事物与持久化_揭开Redis面纱,发布订阅、事务、安全、持久化
  4. SAP UI5 未来发展的趋势之一:拥抱 TypeScript
  5. Springboot-application.properties
  6. linux 网络dma驱动,S3C2410的Linux下DMA驱动程序开发
  7. HTML多选mysql,html多选下拉框 | 学步园
  8. Linux进阶之路————磁盘查询
  9. 在php中使用cookie,PHP中如何使用Cookie
  10. 修改注册表来修改IE的设置---资料汇总
  11. FP Tree算法原理总结
  12. 遥感解译结果(多要素)用Arcgis做拓扑检查
  13. Kafka常见面试题
  14. 直观理解Law of Total Variance(方差分解公式)
  15. 大数据时代的 10 个重大变化
  16. 你这手写vue2.x/3.x的响应式保熟吗?
  17. ACM2023SWJTU寒假选拔赛2不完全题解
  18. 微信公众号(一) --- 开启微信公众号服务
  19. 什么是信息流?如何投放信息流广告?如何收费?
  20. 虚拟服务器上 加密狗 u8,T+12.1标准版,客户服务器是在虚拟机上的,使用硬加密,是否支持在客户端上插上加密狗注册就可以,不用吧加密狗再插到服务器虚拟机上?...

热门文章

  1. iOS—缓存YYCache框架
  2. word无法读取此文档,文档可能已损坏 请尝试下列方法:*打开并修复文件*用文本恢复转换器打开文件
  3. 英镑大写_您也可以为10英镑建立一个出色的网站...
  4. Excel 如何把一行变成对应的多行,或者多行变成对应的一行
  5. 模板 (函数模板语法 ,类模板与函数模板的区别,:函数模板案例,普通函数与函数模板的区别,普通函数与函数模板调用规则,模板的局限性,类模板分文件编写.cpp,Person.hpp,类模板与友元)
  6. 最简单的奇数阶幻方(魔方)算法详解
  7. dcs系统opc服务器,用DCOM技术实现DCS与其OPC服务器的通信.PDF
  8. 小米手机查找位置定位服务器,如何定位查找自己的小米手机?
  9. Bugku web 聪明的php
  10. 光学系统常用光学参数的测量