解决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 相关文章推荐
简单的Jquery遮罩层代码实例
Nov 14 Javascript
jQuery中index()的用法分析
Sep 05 Javascript
Javascript中With语句用法实例
May 14 Javascript
AngularJs Understanding the Controller Component
Sep 02 Javascript
AngularJS中的拦截器实例详解
Apr 07 Javascript
详解vue-cli3多页应用改造
Jun 04 Javascript
你了解vue3.0响应式数据怎么实现吗
Jun 07 Javascript
vue使用i18n实现国际化的方法详解
Sep 05 Javascript
vue实现购物车小案例
Sep 27 Javascript
ES6学习笔记之let与const用法实例分析
Jan 22 Javascript
JS typeof fn === 'function' && fn()详解
Aug 22 Javascript
使用JS实现简易计算器
Jun 14 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
PHP 获取目录下的图片并随机显示的代码
2009/12/28 PHP
ZendFramework2连接数据库操作实例
2017/04/18 PHP
详解thinkphp5+swoole实现异步邮件群发(SMTP方式)
2017/10/13 PHP
微信公众号开发之获取位置信息php代码
2018/06/13 PHP
Laravel 关联模型-关联新增和关联更新的方法
2019/10/10 PHP
TP5框架model常见操作示例小结【增删改查、聚合、时间戳、软删除等】
2020/04/05 PHP
70+漂亮且极具亲和力的导航菜单设计国外网站推荐
2011/09/20 Javascript
简约JS日历控件 实例代码
2013/07/12 Javascript
JQuery获取或设置ckeditor的数据(示例代码)
2013/11/15 Javascript
document.getElementById获取控件对象为空的解决方法
2013/11/20 Javascript
javascript如何创建表格(javascript绘制表格的二种方法)
2013/12/10 Javascript
javascript中数组中求最大值示例代码
2013/12/18 Javascript
JavaScript中发布/订阅模式的简单实例
2014/11/05 Javascript
【JS+CSS3】实现带预览图幻灯片效果的示例代码
2016/03/17 Javascript
jQuery无刷新上传之uploadify简单代码
2017/01/17 Javascript
bootstarp modal框居中显示的实现代码
2017/02/18 Javascript
简单实现jQuery弹窗效果
2017/10/30 jQuery
微信小程序中遇到的iOS兼容性问题小结
2018/11/14 Javascript
vue element动态渲染、移除表单并添加验证的实现
2019/01/16 Javascript
基于 vue-skeleton-webpack-plugin 的骨架屏实战
2019/08/05 Javascript
create-react-app中添加less支持的实现
2019/11/15 Javascript
微信jssdk踩坑之签名错误invalid signature
2020/05/19 Javascript
优化Python代码使其加快作用域内的查找
2015/03/30 Python
windows上安装Anaconda和python的教程详解
2017/03/28 Python
python 容器总结整理
2017/04/04 Python
在python中画正态分布图像的实例
2019/07/08 Python
python实现BP神经网络回归预测模型
2019/08/09 Python
python 中不同包 类 方法 之间的调用详解
2020/03/09 Python
什么是python的列表推导式
2020/05/26 Python
Python2.6版本pip安装步骤解析
2020/08/17 Python
美国女性卫生用品公司:Thinx
2017/06/30 全球购物
简短的公司员工自我评价分享
2013/11/13 职场文书
大学毕业感言50字
2014/02/07 职场文书
消防先进事迹材料
2014/02/10 职场文书
外贸专业求职信
2014/03/09 职场文书
校庆筹备方案
2014/03/30 职场文书