解决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 相关文章推荐
让任务管理器中的CPU跳舞的js代码
Nov 01 Javascript
jQuery 数据缓存data(name, value)详解及实现
Jan 04 Javascript
分享一个自己写的table表格排序js插件(高效简洁)
Oct 29 Javascript
JS关键字变色实现思路及代码
Feb 21 Javascript
AngularJS实现全选反选功能
Dec 08 Javascript
jquery删除table当前行的实例代码
Oct 07 Javascript
浅谈js原生拖放
Nov 21 Javascript
DVA框架统一处理所有页面的loading状态
Aug 25 Javascript
详解node+express+ejs+bootstrap构建项目
Sep 27 Javascript
BootStrap Validator 根据条件在JS中添加或移除校验操作
Oct 12 Javascript
实例分析Array.from(arr)与[...arr]到底有何不同
Apr 09 Javascript
vue3.0中使用postcss-pxtorem的具体方法
Nov 20 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接收shell返回的结果中文乱码问题
2014/01/23 PHP
PHP使用strtotime计算两个给定日期之间天数的方法
2015/03/18 PHP
纯php生成随机密码
2015/10/30 PHP
Yii2超好用的日期和时间组件(值得收藏)
2016/05/05 PHP
php版微信发红包接口用法示例
2016/09/23 PHP
Jquery 选中表格一列并对表格排序实现原理
2012/12/15 Javascript
用JavaScript修改CSS属性的代码
2013/05/06 Javascript
JS获取计算机mac地址以及IP的实现方法
2014/01/08 Javascript
Nodejs极简入门教程(三):进程
2014/10/27 NodeJs
DOM基础教程之模型中的模型节点
2015/01/19 Javascript
原生JS实现仿淘宝网左侧商品分类菜单效果代码
2015/09/10 Javascript
JSON格式的时间/Date(2367828670431)/格式转为正常的年-月-日 格式的代码
2016/07/27 Javascript
JavaScript时间戳与时间日期间相互转换
2017/12/11 Javascript
vue+iview+less+echarts实战项目总结
2018/02/22 Javascript
nodejs用gulp管理前端文件方法
2018/06/24 NodeJs
JavaScript中filter的用法实例分析
2019/02/27 Javascript
js前端面试之同步与异步问题详解
2019/04/03 Javascript
原生JS封装拖动验证滑块的实现代码示例
2020/06/01 Javascript
three.js显示中文字体与tween应用详析
2021/01/04 Javascript
[40:55]Liquid vs LGD 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
使用setup.py安装python包和卸载python包的方法
2013/11/27 Python
win10下tensorflow和matplotlib安装教程
2018/09/19 Python
python+webdriver自动化环境搭建步骤详解
2019/06/03 Python
Python学习笔记之错误和异常及访问错误消息详解
2019/08/08 Python
python如何发送带有附件、正文为HTML的邮件
2021/02/27 Python
纯css3制作的火影忍者写轮眼开眼至轮回眼及进化过程实例
2014/11/11 HTML / CSS
HTML5的革新 结构之美
2011/06/20 HTML / CSS
html5给汉字加拼音加进度条的实现代码
2020/04/07 HTML / CSS
中医专业职业生涯规划书范文
2014/01/04 职场文书
运动会广播稿400字
2014/01/25 职场文书
市场开发与营销专业求职信范文
2014/05/01 职场文书
2014镇副书记群众路线专题民主生活会思想汇报
2014/09/23 职场文书
个人师德师风自我剖析材料
2014/09/29 职场文书
湖南省党的群众路线教育实践活动总结会议新闻稿
2014/10/21 职场文书
2015年挂职干部工作总结
2015/05/14 职场文书
七年级思品教学反思
2016/02/20 职场文书