解决Vue.js应用回退或刷新界面时提示用户保存修改问题


Posted in Javascript onNovember 24, 2019

在实际应用中,运营人员在编辑数据时不希望因不小心点击了浏览器的回退或刷新按钮导致花费了很长时间编辑的数据丢失。可以采用以下两种手段防止运营编辑时丢失数据:

在运营人员刷新页面或回退时,自动保留数据至浏览器端本地存储,在重新进入编辑页面时再将数据从本地存储中加载到编辑界面。
第二种方法是在运营人员刷新或回退时,强提示运营人员有修改的数据尚未保存,询问是否继续。

无认采用哪一种方式,在技术实现上,我们需要首先能够监听到用户执行回退或刷新页面的动作。

实际上,当用户执行页面刷新时,会触发 window 对象上的 onBeforeUnload 事件。所以,我们需要在页面加载时开始监听此事件。在Vue.js应用中,我们可以在Vue.js的 mounted 生命周期事件函数中开始监听。

mounted() {
  window.onbeforeunload = e => {
    if (!this.modified) {
    return;
    }
    // 通知浏览器不要执行与事件关联的默认动作
    e.preventDefault();
    // Chrome 需要 returnValue 被设置成空字符串
    e.returnValue = '';
  };
},

有了以上的代码,只要我们在修改了数据以后,将 modified 的值改为true,则可以在刷新整个页面时弹出如下提示:

解决Vue.js应用回退或刷新界面时提示用户保存修改问题 

当用户点击上述对话框的[ 取消 ]按钮后,会取消刷新动作,当用户选择[ 重新加载 ]后,浏览器会强制进行页面的刷新。

由于在Vue.js应用中,通常是一个页面的应用,所有的子页面享用一个window对象,所以,如果在一个Vue.js页面组件中增加了对onBeforUnload事件的监听,则可能会影响其它页面组件的相关行为,而在其他页面(如,仅浏览数据的页面)是不希望进行相关的提示的,所以,我们需要在Vue.js组件卸载的时候取消对onBeforeUnload事件的监听。

destroyed() {
  // 取消对事件的监听
  window.onbeforeunload = null;
  },

用户除了通过浏览器刷新操作退出外,还有两种可能的退出途径:

  • 点击浏览器的前进或回退操作按钮
  • 点击单页面中的前端路由链接

对于以上两种退出途径,onBeforeLoad事件通常是拦截不到相应的事件的,因为这两种操作一般是前端路由的行为。

既然是前端路由的行为,我们就需要在前端路由事件上下功夫。可喜的是,前端路由vue-router为我们提供了 导航守卫 的能力。关于vue-router导航守卫的相关知识,大家可以参考: vue-router前端路由导航守卫 。

前端路由导航守卫分为全局守卫、独享守卫、组件内守卫等。这里我们使用的是组件内守卫。

组件内守卫有以下三种

  • beforeRouteEnter 组件第一次被渲染时调用
  • beforeRouteUpdate 路由改变但组件被复用时调用
  • beforeRouteLeave 导航离开组件时调用

显而易见,我们需要监听并处理 beforeRouteLeave 事件。

beforeRouteLeave(to, from, next) {
  if (!this.modified) {
    next();
    return;
  }
  this.$confirm('当前页面数据未保存,确定要离开?', '提示', { type: 'warning' })
  .then(() => {
    next();
  })
  .catch(() => {
   next(false);
  });
},

有了以上的代码,当我们在进行路由切换时(点击浏览器回退按钮或点击页面中的其它路由链接)就会提示如下的对话框:

解决Vue.js应用回退或刷新界面时提示用户保存修改问题 

当用户选择取消时,回到原界面,当用户点击确定按钮后,页面强制刷新。

总结

以上所述是小编给大家介绍的解决Vue.js应用回退或刷新界面时提示用户保存修改问题,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小会及时回复大家的!

Javascript 相关文章推荐
JS如何将数字类型转化为没3个一个逗号的金钱格式
Jan 27 Javascript
javascript实现获取浏览器版本、操作系统类型
Jan 29 Javascript
javascript格式化指定日期对象的方法
Apr 21 Javascript
JavaScript中setFullYear()方法的使用详解
Jun 11 Javascript
详解Bootstrap四种图片样式
Jan 04 Javascript
基于Jquery插件Uploadify实现实时显示进度条上传图片
Mar 26 Javascript
JavaScript实现使用Canvas绘制图形的基本教程
Oct 27 Javascript
浅谈js的解析顺序 作用域 严格模式
Oct 23 Javascript
webpack3之loader全解析
Oct 26 Javascript
vue使用Proxy实现双向绑定的方法示例
Mar 20 Javascript
微信小程序实现多选框全选与反全选及购物车中删除选中的商品功能
Dec 17 Javascript
浅谈TypeScript的类型保护机制
Feb 23 Javascript
Egg Vue SSR 服务端渲染数据请求与asyncData
Nov 24 #Javascript
mpvue微信小程序开发之实现一个弹幕评论
Nov 24 #Javascript
node.js中Buffer缓冲器的原理与使用方法分析
Nov 23 #Javascript
node.js中事件触发器events的使用方法实例分析
Nov 23 #Javascript
javascript 原型与原型链的理解及实例分析
Nov 23 #Javascript
jquery 插件重新绑定的处理方法分析
Nov 23 #jQuery
微信小程序实现录音功能
Nov 22 #Javascript
You might like
《魔兽争霸3:重制版》翻车了?你想要的我们都没有
2019/11/07 魔兽争霸
php cURL和Rolling cURL并发方式比较
2013/10/30 PHP
简单了解WordPress开发中update_option()函数的用法
2016/01/11 PHP
PHP简单获取及判断提交来源的方法
2016/04/22 PHP
TP5框架实现自定义分页样式的方法示例
2020/04/05 PHP
修改js Calendar日历控件 兼容IE9/谷歌/火狐
2013/01/04 Javascript
jQuery实现网页抖动的菜单抖动效果
2015/08/07 Javascript
KnockoutJs快速入门教程
2016/05/16 Javascript
用js实现放大镜的效果的简单实例
2016/05/23 Javascript
Angularjs中的验证input输入框只能输入数字和小数点的写法(推荐)
2017/08/16 Javascript
JavaScript中关于class的调用方法
2017/11/28 Javascript
element 中 el-menu 组件的无限极循环思路代码详解
2020/04/26 Javascript
vue实现的多页面项目如何优化打包的步骤详解
2020/07/19 Javascript
Node.js path模块,获取文件后缀名操作
2020/11/07 Javascript
[03:16]DOTA2完美大师赛小组赛精彩集锦
2017/11/22 DOTA
Flask数据库迁移简单介绍
2017/10/24 Python
Django1.9 加载通过ImageField上传的图片方法
2018/05/25 Python
python截取两个单词之间的内容方法
2018/12/25 Python
python循环定时中断执行某一段程序的实例
2019/06/29 Python
python买卖股票的最佳时机(基于贪心/蛮力算法)
2019/07/05 Python
在Pytorch中使用样本权重(sample_weight)的正确方法
2019/08/17 Python
python爬虫 urllib模块反爬虫机制UA详解
2019/08/20 Python
利用Tensorboard绘制网络识别准确率和loss曲线实例
2020/02/15 Python
最新2019Pycharm安装教程 亲测
2020/02/28 Python
使用Matplotlib绘制不同颜色的带箭头的线实例
2020/04/17 Python
Python数据相关系数矩阵和热力图轻松实现教程
2020/06/16 Python
西班牙香水和化妆品购物网站:Arenal Perfumerías
2019/03/01 全球购物
英国护发和美妆在线商店:Klip Shop
2019/03/24 全球购物
求两个数的乘积和商数,该作用由宏定义来实现
2013/03/13 面试题
档案室主任岗位职责
2014/02/12 职场文书
表扬稿范文
2015/01/17 职场文书
督导岗位职责
2015/02/04 职场文书
项目合作意向书
2015/05/08 职场文书
家长对孩子的寒假评语
2015/10/09 职场文书
世界无敌的ICOM IC-R9500宽频接收机
2022/03/25 无线电
分析SQL窗口函数之排名窗口函数
2022/04/21 Oracle