在项目开发中遇到用户编辑内容后未保存推出编辑页面时需要提示用户“当前数据未保存,是否退出”,实际开发中利用window.onbeforeunload方法与vue.$on方法在updated生命周期函数中做出相的判断,做出相应的操作。

准备

onbeforeunload 事件

在即将离开当前页面(刷新或关闭)时执行JavaScript

  • onbeforeunload 事件在即将离开当前页面(刷新或关闭)时触发
  • 该事件可用于弹出对话框,提示用户是继续浏览页面还是离开当前页面
  • 对话框默认的提示信息根据不同的浏览器有所不同,标准的信息类似 "确定要离开此页吗?"。该信息不能删除。
  • 可以自定义一些消息提示与标准信息一起显示在对话框。
<element onbeforeunload="myScript">
object.onbeforeunload=function(){myScript};
object.addEventListener("beforeunload", myScript);

vm.$on( event, callback )

参数:

  • {string | Array} event (数组只在 2.2.0+ 中支持)
  • {Function} callback

用法:

  • 监听当前实例上的自定义事件。事件可以由 vm.$emit 触发。
  • 回调函数会接收所有传入事件触发函数的额外参数。

示例:

vm.$on('test', function (msg) {
console.log(msg)
})
vm.$emit('test', 'hi')
// => "hi"

步骤

第一步:创建方法在common.js下新建leaveConfirm方法并且默认暴露 export default{}

  • @param {Component} vm vue实例
  • @param {Function} fn 生效条件,返回布尔值
  • @param {String} tip 离开页面提示语
leaveConfirm(
vm,
fn = () => {
return false;
},
tip = "当前页面数据未保存,确认离开?"
) {
_leaveConfirmVm = vm;
vm.$on("hook:updated", () => {
window.onbeforeunload = function (event) {
if (fn(vm)) {
event = event || window.event;
if (event) {
event.preventDefault();
event.returnValue = "关闭提示";
}
return "关闭提示";
} else {
return null;
}
};
});
//组件销毁后移出onbeforeunload事件
vm.$on("hook:beforeDestroy", () => {
window.onbeforeunload = null;
router.beforeResolve = () => {};
});
//增加路由拦截,执行完next()后需要将beforeResolve重置
router.beforeResolve((to, from, next) => {
if (fn(_leaveConfirmVm)) {
const answer = window.confirm(tip);
answer ? next() : next(false);
} else {
next();
}
});
},

第二步:在main.js将其挂载在vue原型上(需要引入leaveConfirm方法)

import common from './utils'
Vue.prototype.$leaveConfirm = common.leaveConfirm

第三步:在vue组件中使用

this.$leaveConfirm(this,(vm)= >{
return (
!vm.btnLoading &&
JSON.stringify(vm.inirParams) !== JSON.stringfiy(vm.params)
)
//可自行设置判断条件
})

总结

这只是其中的一种实现方式,也可以结合一些ui插件(elementui等)做出更多的效果。如有不足之处,请留下你的意见。

Vue实现离开页面二次确认的更多相关文章

  1. vue离开页面销毁定时器

    beforeDestroy() { if(this.timer) { clearInterval(this.timer); //关闭 }  //利用vue的生命周期函数 vue 是单页面应用,路由切换 ...

  2. 高性能流媒体服务器EasyDSS前端重构(二) webpack + vue + AdminLTE 多页面提取共用文件, 优化编译时间

    本文围绕着实现EasyDSS高性能流媒体服务器的前端框架来展开的,具体EasyDSS的相关信息可在:www.easydss.com 找到! 接上回 <高性能流媒体服务器EasyDSS前端重构(一 ...

  3. 前端 | Vue 路由返回恢复页面状态

    需求场景:首页搜索内容,点击跳转至详情页,页面后退返回主页,保留搜索结果. 方案:路由参数:路由守卫 需求描述 在使用 Vue 开发前端的时候遇到一个场景:在首页进行一些数据搜索,点击搜索结果进入详情 ...

  4. 前端Vue项目——登录页面实现

    一.geetest滑动验证 geetest官方文档地址:https://docs.geetest.com/ 产品——极速验证:基于深度学习的人机识别应用.极验「行为验证」是一项可以帮助你的网站与APP ...

  5. 从壹开始前后端分离 [ vue + .netcore 补充教程 ] 二九║ Nuxt实战:异步实现数据双端渲染

    回顾 哈喽大家好!又是元气满满的周~~~二哈哈,不知道大家中秋节过的如何,马上又是国庆节了,博主我将通过三天的时间,给大家把项目二的数据添上(这里强调下,填充数据不是最重要的,最重要的是要配合着让大家 ...

  6. 高性能流媒体服务器EasyDSS前端重构(一)-从零开始搭建 webpack + vue + AdminLTE 多页面脚手架

    本文围绕着实现EasyDSS高性能流媒体服务器的前端框架来展开的,具体EasyDSS的相关信息可在:www.easydss.com 找到! EasyDSS 高性能流媒体服务器前端架构概述 EasyDS ...

  7. vue.js学习笔记(二)——vue-router详解

    vue-router详解 原文链接:www.jianshu.com 一.前言 要学习vue-router就要先知道这里的路由是什么?为什么我们不能像原来一样直接用<a></a> ...

  8. 高性能流媒体服务器EasyDSS前端重构(三)- webpack + vue + AdminLTE 多页面引入 element-ui

    接上篇 接上篇<高性能流媒体服务器EasyDSS前端重构(二) webpack + vue + AdminLTE 多页面提取共用文件, 优化编译时间> 本文围绕着实现EasyDSS高性能流 ...

  9. Vue源码分析(二) : Vue实例挂载

    Vue源码分析(二) : Vue实例挂载 author: @TiffanysBear 实例挂载主要是 $mount 方法的实现,在 src/platforms/web/entry-runtime-wi ...

随机推荐

  1. 哔哩哔哩b站提取Cookie方法,bilibili获取Cookie教程

    大家可能对Cookie很陌生,甚至不知道是干嘛用,没关系,今天小编详细给大家讲解! Cookie是保存在客户端的纯文本文件,比如txt文件,所谓的客户端就是我们自己的本地电脑,当我们使用自己的电脑通过 ...

  2. Queue-jumpers - 平衡树

    题面 Ponyo and Garfield are waiting outside the box-office for their favorite movie. Because queuing i ...

  3. cobaltstrike进行局域网远控

    用cobaltstrike进行局域网远控 cobalt strike(简称CS)是一款团队作战渗透测试神器,分为客户端及服务端,一个服务端可以对应多个客户端,一个客户端可以连接多个服务端. 实验原理: ...

  4. 面试突击79:Bean 作用域是啥?它有几种类型?

    Spring 框架作为一个管理 Bean 的 IoC 容器,那么 Bean 自然是 Spring 中的重要资源了,那 Bean 的作用域是什么意思?又有几种类型呢?接下来我们一起来看. PS:Java ...

  5. Django 运行报异常:AttributeError: 'str' object has no attribute 'get'

    Technorati Tags: Python,Django,Web 在使用django.contrib.auth用户机制进行用户的验证.登录.注销操作时,遇到这个异常. 首先是写了一个登录的视图,要 ...

  6. 入门Python,看完这篇就行了!

    转载请注明出处️ 作者:测试蔡坨坨 原文链接:caituotuo.top/3bbc3146.html 你好,我是测试蔡坨坨. 众所周知,Python语法简洁.功能强大,通过简单的代码就能实现很多实用. ...

  7. Jenkins 中使用 Git Parameter 插件动态获取 Git 的分支

  8. CentOS7 安装 Git 服务器

    1.安装Git $ yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel perl-devel $ yum ...

  9. 在 Linux 中找出内存消耗最大的进程

    1 使用 ps 命令在 Linux 中查找内存消耗最大的进程 ps 命令用于报告当前进程的快照.ps 命令的意思是"进程状态".这是一个标准的 Linux 应用程序,用于查找有关在 ...

  10. C#-12 转换

    一 什么是转换 转换是接受一个类型的值并使用它作为另一个类型的等价值的过程. 下列代码演示了将1个short类型的值强制转换成byte类型的值. short var1 = 5; byte var2 = ...