在项目开发中遇到用户编辑内容后未保存推出编辑页面时需要提示用户“当前数据未保存,是否退出”,实际开发中利用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. HMS Core Discovery第17期回顾|音随我动,秒变音色造型师

    HMS Core Discovery第17期直播<音随我动,秒变音色造型师>,已于8月25日圆满结束,本期直播我们邀请了HMS Core音频编辑服务的产品经理.技术专家以及创新娱乐类应用& ...

  2. NOI 2019 省选模拟赛 T1【JZOJ6082】 染色问题(color) (多项式,数论优化)

    题面 一根长为 n 的无色纸条,每个位置依次编号为 1,2,3,-,n ,m 次操作,第 i 次操作把纸条的一段区间 [l,r] (l <= r , l,r ∈ {1,2,3,-,n})涂成颜色 ...

  3. IPV6属于自己专属公网IP

    有了公网IP就可以搭建网站 简单理解公网IP就是私人的服务器 搭建之前一定要注意!没有网络安全意识的不要随便搭建 如何搭建? 材料如下 支持IPV6的光猫 支持IPV6的路由器 支持IPV6的设备 方 ...

  4. Java接口自动化测试框架系列(一)自动化测试框架

    一.什么是自动化测试 自动化测试是把以人为驱动的测试行为转化为机器执行的一种过程. 通常,在设计了测试用例并通过评审之后,由测试人员根据测试用例一步步执行测试,得到实际结果与期望结果的比较. 为了节省 ...

  5. 04_Django-模板变量/标签/过滤器/继承-url反向解析

    04_Django-模板变量/标签/过滤器/继承-url反向解析 视频:https://www.bilibili.com/video/BV1vK4y1o7jH 博客:https://blog.csdn ...

  6. Neo4j入门详细教程

    Neo4j安装配置 (1)下载安装包 (2)安装jdk (3)环境变量配置 分三步,具体参考  https://www.bilibili.com/video/BV1Nz411q7bG?from=sea ...

  7. 【Android 逆向】动态调试AliCrackme_1

    1 试玩 apk # 安装APK到真机 adb install AliCrackme_1.apk 打开apk,投石问路,输入123试一下 2 将apk 拖入androidKiller,得到反编译的sm ...

  8. Unity-编辑器拓展之GUILayout,EditorGUILayout布局 { }

    Unity 脚本 API 中文版 链接: https://docs.unity3d.com/cn/2019.4/ScriptReference/ 创建自定义窗口 public class MyWind ...

  9. Ansible_基础模块

    特点:无主从,即装即用,基于ssh 安装ansible yum install epel-release -y yum install ansible -y 定义主机清单 vim /etc/ansib ...

  10. sklearn中MLPClassifier源码解析

    神经网络 .fit() 首先传入类私用方法._fit() 确定hidden_layer_size是可迭代的 调用_validate_hyperparameters验证超参数是否合法 验证输入的x和y是 ...