React 系统中,在离开编辑页面前做提示

汉朝老贼
这个人很懒,什么也没留下。

3 人赞同了该文章

在做有编辑器相关需求的时候,遇到一个之前没遇到过的需求:用户离开当前页面前,需要提示用户保存。
由于是用 react 开发的单页应用,涉及到离开当前页面的场景会有: 1. 用户系统内跳转到其他路由 2. 用户点击浏览器上的刷新、关闭浏览器标签页等操作
下面分开解决以上问题。
路由跳转
路由跳转会导致组件卸载,我们自然而然会想到在 react 组件的 componentWillUnmount 生命周期中做一些提示,但是使用这个方法会有个问题:这里并没有办法阻止路由的跳转,这个过程是不可终止的,所以并不能满足需求。
我最开始的想法是在 react 生态中寻找类似于 Vue Router 的 导航守卫 来实现对路由跳转的拦截
beforeRouteLeave (to, from , next) { const answer = window.confirm('Do you really want to leave? you have unsaved changes!') if (answer) { next() } else { next(false) } }
这个离开守卫通常用来禁止用户在还未保存修改前突然离开。该导航可以通过 next(false) 来取消。
而在 react-router 之前的版本也是存在路由守卫的,但是很遗憾,react-router-dom v4 去除了相关 api,但是我们可以通过其提供的 <Prompt/> 组件来实现。
import {Prompt} from 'react-router-dom'; // 只需把这个组件放在页面中,即可实现路由跳转前的拦截提示 <div> <Prompt when={true} message={() => '离开当前页后,所编辑的数据将不可恢复'} /> </div>

  • when 可以动态改变是否需要提示
  • message 为提示消息

这样,只要是跳转到其他路由都会触发这个提示。
效果如图:

浏览器级刷新或者关闭页面
当浏览器窗口关闭或者刷新时,会触发 beforeunload 事件。当前页面不会直接关闭,可以点击确定按钮关闭或刷新,也可以取消关闭或刷新。
如果处理函数为 Event 对象的 returnValue 属性赋值非空字符串,浏览器会弹出一个对话框,来询问用户是否确定要离开当前页面。有些浏览器会将返回的字符串展示在弹框里,但有些其他浏览器只展示它们自定义的信息。没有赋值时,该事件不做任何响应。
我们只需在页面组件上绑定该事件,即可完成该功能。
const listener = e => { e.preventDefault(); e.returnValue = '离开当前页后,所编辑的数据将不可恢复' // 浏览器有可能不会提示这个信息,会按照固定信息提示 } // ... componentDidMount() { window.addEventListener('beforeunload', listener) }, componentWillUnmount() { window.removeEventListener('beforeunload', listener) } // ....
效果如图:

最后,我们可以把这两部分逻辑抽象起来,形成一个需要具有该特定功能的组件,不过这部分就不贴出来了,与主题相关度不足。

beforeunload中阻止提示关闭_React 系统中,在离开编辑页面前做提示相关推荐

  1. win7关闭系统索引服务器,如何关闭Windows7系统中的索引功能

    Windows7系统中的索引功能有什么作用?简单的说就是为系统的文件等内容提供索引和搜索结果,一般很少用到,而且还占用一定的系统资源,如果你发觉你的系统越来越慢,可通过关闭索引功能. 如何关闭Wind ...

  2. win7oracle启动服务,如何快速启动/关闭Win7系统中的oracle服务

    如何快速启动/关闭Win7系统中的oracle服务  在我们使用开发系统的时候,我们就需要使用到oracle数据库,在我们使用的Win7系统重装中都会有一个oracle服务,通常这个服务都是关闭的.如 ...

  3. Win10中启动或关闭Windows功能中没有SNMP服务的解决办法

    Win10中启动或关闭Windows功能中没有SNMP服务的解决办法 设置–更新与安全–开发者选项,选择开发人员模式或者开发者模式: 退回到设置界面,选择应用,点击可选功能进入,添加功能,输入SNMP ...

  4. 应用在射频条件下木材干燥试验过程中温湿度和压力监控系统中的光纤传感器

    射频(RF)是Radio Frequency的缩写,表示可以辐射到空间的电磁频率,频率范围从300kHz-300GHz之间.射频就是射频电流,简称RF,它是一种高频交流变化电磁波的简称.每秒变化小于1 ...

  5. (继续搬)struts日期格式的转换以及hibernate中session的关闭在xml中的配置

    1.struts日期格式的转换package cn.sxx.utils;import java.text.ParseException; import java.text.SimpleDateForm ...

  6. linux外部设备在哪个目录,因为 在这个目录中包含了所有Linux系统中使用的外部设备...

    dev是设备(device)的英文缩写./dev这个目录对所有的用户都十分重要.因为 在这个目录中包含了所有Linux系统中使用的外部设备.但是这里并不是放的外部设备的驱动程序,这一点和windows ...

  7. beforeunload中阻止提示关闭_Win10电脑中如何禁用或启用Defender的 PUA (PUP) 保护-系统城...

    在win10系统中,新增了一个安全性选项,该选项将使用户能够启用Windows Defender秘密功能,该功能可以检测并阻止已知的PUA(潜在有害应用程序)的安装.该功能默认情况下处于关闭状态的,那 ...

  8. 在linux终端中重命名文件,Linux系统中重命名文件的方法有哪些

    今天小编要跟大家分享的文章是关于Linux系统中重命名文件的方法有哪些.正在从事Linux运维工作和学习Linux运维知识的小伙伴们来和小编一起看一看吧,希望本篇文章能够对大家有所帮助. 在Linux ...

  9. 在linux中at 调度出错,linux系统中的调度延迟任务:at 命令

    linux系统中的调度延迟任务:at 命令 主要概念 at命令可以使命令稍后运行 batch命令可以让命令在机器负载较低的情况下运行 可以直接进入命令,或者以脚本形式提交命令 作业中的标准输出用邮件发 ...

  10. 在linux系统中创建文件夹,Linux系统中创建文件夹命令详解

    Linux系统中创建一个新的文件夹我们可以使用命令来执行,下面由学习啦小编为大家整理了Linux系统中创建文件夹命令详解,希望对大家有帮助! Linux系统中创建文件夹命令详解 一.mkdir命令使用 ...

最新文章

  1. 多语言互通:谷歌发布实体检索模型,涵盖超过100种语言和2000万个实体
  2. pytorch中的torch.nn.LSTM解析
  3. logging 模块记录日志
  4. Installation error: INSTALL_FAILED_UPDATE_INCOMPATIBLE解决方法
  5. apache java windows_Apache for Windows 安装
  6. linux shell 算术运算{expr、bc、dc、(( ))和[ ]}
  7. 深入浅出计算机组成原理学习笔记:高速缓存(下)-你确定你的数据更新了么?(第38讲)...
  8. TensorFLow RCNN
  9. 排序算法之归并排序(JAVA)
  10. 实例分割——转置卷积的学习笔记
  11. android 开发 目标绑定,Hippy: Hippy 是一个新生的跨端开发框架,目标是使开发者可以只写一套代码就直接运行于三个平台(iOS、Android 和 Web)...
  12. LooseScan Strategy
  13. 计算机毕业论文答辩评语,论文答辩评语
  14. 打印纸张尺寸换算_常用纸张的尺寸大小对照表
  15. 双硬盘安装win10和linux双系统,双硬盘安装win10+ubuntu18心得
  16. centos7挂载win10共享文件夹详解
  17. 力扣 python刷题
  18. tomcat服务器连接数问题解决
  19. Android 广告秘籍
  20. makefile和make

热门文章

  1. java.lang.ClassNotFoundException: net.sf.json.JSONObject
  2. 割裂的前端工程师--- 2017年前端生态窥探
  3. hadoop之安全模式,HDFS的读取,写入
  4. Roboter's blog » python 读取ini文件
  5. S5PV210 的IIC是四路还是三路的?原来内置一路IIC啊!
  6. .net开源CMS系统使用教程之:如何用We7 CMS建设全新网站
  7. 一步一步教你使用AgileEAS.NET基础类库进行应用开发-基础篇-涉及的数据定义
  8. Abp 为Swagger接口页添加详细注释
  9. 关于Visual Studio “当前不会命中断点.还没有为该文档加载任何符号“的解决方法
  10. PHP数据处理:合并数据、详情数据