解决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 相关文章推荐
获取表单控件原始(初始)值的方法
Aug 21 Javascript
Javascript:为input设置readOnly属性(示例讲解)
Dec 25 Javascript
纯js代码实现简单计算器
Dec 02 Javascript
jQuery基础的工厂函数以及定时器的经典实例分析
May 20 Javascript
AngularJS基础 ng-paste 指令简单示例
Aug 02 Javascript
jQuery弹出div层过2秒自动消失
Nov 29 Javascript
Javascript之深入浅出prototype
Feb 06 Javascript
JS+canvas绘制的动态机械表动画效果
Sep 12 Javascript
详解使用 Node.js 开发简单的脚手架工具
Jun 08 Javascript
详解Require.js与Sea.js的区别
Aug 05 Javascript
vue父子组件的通信方法(实例详解)
Nov 10 Javascript
使用vue构建多页面应用的示例
Oct 22 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
mysqli_set_charset和SET NAMES使用抉择及优劣分析
2013/01/13 PHP
PHP 面向对象程序设计(oop)学习笔记 (五) - PHP 命名空间
2014/06/12 PHP
PHP通过调用新浪API生成t.cn格式短网址链接的方法详解
2019/02/20 PHP
PHP进阶学习之Geo的地图定位算法详解
2019/06/19 PHP
Yii2.0框架模型多表关联查询示例
2019/07/18 PHP
laravel框架之数据库查出来的对象实现转化为数组
2019/10/23 PHP
javascript  Error 对象 错误处理
2008/05/18 Javascript
js事件监听机制(事件捕获)总结
2014/08/08 Javascript
jQuery中andSelf()方法用法实例
2015/01/08 Javascript
7个去伪存真的JavaScript面试题
2016/01/07 Javascript
深入浅析Extjs中store分组功能的使用方法
2016/04/20 Javascript
Javascript实现图片懒加载插件的方法
2016/10/20 Javascript
AngularJS使用ng-inlude指令加载页面失败的原因与解决方法
2017/01/19 Javascript
js模仿微信朋友圈计算时间显示几天/几小时/几分钟/几秒之前
2017/04/27 Javascript
js图片上传的封装代码
2017/08/01 Javascript
Vue程序调试的方法
2019/06/17 Javascript
[01:38]女王驾到——至宝魔廷新尊技能&特效展示
2020/06/16 DOTA
Win7上搭建Cocos2d-x 3.1.1开发环境
2014/07/03 Python
python在控制台输出进度条的方法
2015/06/20 Python
在PyCharm环境中使用Jupyter Notebook的两种方法总结
2018/05/24 Python
利用pyuic5将ui文件转换为py文件的方法
2019/06/19 Python
Python 硬币兑换问题
2019/07/29 Python
opencv实现简单人脸识别
2021/02/19 Python
使用python快速在局域网内搭建http传输文件服务的方法
2019/11/14 Python
nginx搭建基于python的web环境的实现步骤
2020/01/03 Python
Python如何实现远程方法调用
2020/08/07 Python
html5-canvas中使用clip抠出一个区域的示例代码
2018/05/25 HTML / CSS
HTML5添加禁止缩放功能
2017/11/03 HTML / CSS
html2canvas把div保存图片高清图的方法示例
2018/03/05 HTML / CSS
美国汽车轮胎和轮毂销售网站:Tire Rack
2018/01/11 全球购物
草莓网官网:StrawberryNET
2019/08/21 全球购物
思想汇报格式
2014/01/05 职场文书
电话客服工作职责
2014/07/27 职场文书
活动总结书怎么写
2015/05/11 职场文书
用Python爬虫破解滑动验证码的案例解析
2021/05/06 Python
未发现nvidia显卡怎么办?Win11系统中未检测到nvidia显卡解决教程
2022/04/08 数码科技