Vue实现离开页面二次确认
在项目开发中遇到用户编辑内容后未保存推出编辑页面时需要提示用户“当前数据未保存,是否退出”,实际开发中利用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实现离开页面二次确认的更多相关文章
- vue离开页面销毁定时器
beforeDestroy() { if(this.timer) { clearInterval(this.timer); //关闭 } //利用vue的生命周期函数 vue 是单页面应用,路由切换 ...
- 高性能流媒体服务器EasyDSS前端重构(二) webpack + vue + AdminLTE 多页面提取共用文件, 优化编译时间
本文围绕着实现EasyDSS高性能流媒体服务器的前端框架来展开的,具体EasyDSS的相关信息可在:www.easydss.com 找到! 接上回 <高性能流媒体服务器EasyDSS前端重构(一 ...
- 前端 | Vue 路由返回恢复页面状态
需求场景:首页搜索内容,点击跳转至详情页,页面后退返回主页,保留搜索结果. 方案:路由参数:路由守卫 需求描述 在使用 Vue 开发前端的时候遇到一个场景:在首页进行一些数据搜索,点击搜索结果进入详情 ...
- 前端Vue项目——登录页面实现
一.geetest滑动验证 geetest官方文档地址:https://docs.geetest.com/ 产品——极速验证:基于深度学习的人机识别应用.极验「行为验证」是一项可以帮助你的网站与APP ...
- 从壹开始前后端分离 [ vue + .netcore 补充教程 ] 二九║ Nuxt实战:异步实现数据双端渲染
回顾 哈喽大家好!又是元气满满的周~~~二哈哈,不知道大家中秋节过的如何,马上又是国庆节了,博主我将通过三天的时间,给大家把项目二的数据添上(这里强调下,填充数据不是最重要的,最重要的是要配合着让大家 ...
- 高性能流媒体服务器EasyDSS前端重构(一)-从零开始搭建 webpack + vue + AdminLTE 多页面脚手架
本文围绕着实现EasyDSS高性能流媒体服务器的前端框架来展开的,具体EasyDSS的相关信息可在:www.easydss.com 找到! EasyDSS 高性能流媒体服务器前端架构概述 EasyDS ...
- vue.js学习笔记(二)——vue-router详解
vue-router详解 原文链接:www.jianshu.com 一.前言 要学习vue-router就要先知道这里的路由是什么?为什么我们不能像原来一样直接用<a></a> ...
- 高性能流媒体服务器EasyDSS前端重构(三)- webpack + vue + AdminLTE 多页面引入 element-ui
接上篇 接上篇<高性能流媒体服务器EasyDSS前端重构(二) webpack + vue + AdminLTE 多页面提取共用文件, 优化编译时间> 本文围绕着实现EasyDSS高性能流 ...
- Vue源码分析(二) : Vue实例挂载
Vue源码分析(二) : Vue实例挂载 author: @TiffanysBear 实例挂载主要是 $mount 方法的实现,在 src/platforms/web/entry-runtime-wi ...
随机推荐
- Spring5事务管理
事务管理是什么? 相当于过滤器,如果这一进程中上一个操作正常执行完后提交数据已经发生改变,但是下一个操作中出现了异常,这样就会影响数据的查看. 典型例子:银行转账,甲方已经转钱给乙方(甲方已扣钱),乙 ...
- Spark 读Hive并写入HBase
package com.grady import org.apache.hadoop.hbase.HBaseConfiguration import org.apache.hadoop.hbase.c ...
- Python实践项目——LSB隐写术
此为北京理工大学某专业某学期某课程的某次作业 一.项目背景 1.隐写术 隐写术是一门关于信息隐藏的技巧与科学,所谓信息隐藏指的是不让除预期的接收者之外的任何人知晓信息的传递事件或者信息的内容. 2.L ...
- Python中None作为索引的作用
None的作用主要是在使用None的位置新增一个维度. a = np.arange(25).reshape(5,5) print(a) ''' [[ 0 1 2 3 4] [ 5 6 7 8 9] [ ...
- B树-插入
B树系列文章 1. B树-介绍 2. B树-查找 3. B树-插入 4. B树-删除 插入 根据B树的以下两个特性 每一个结点最多有m个子结点 有k个子结点的非叶子结点拥有 k − 1 个键 可以得出 ...
- Django提交时报错
错误描述: RuntimeError at /saveBlog You called this URL via POST, but the URL doesn't end in a slash and ...
- MySQL DDL执行方式-Online DDL介绍
1 引言 大家好,今天与大家一起分享一下 mysql DDL执行方式. 一般来说MySQL分为DDL(定义)和DML(操作). DDL:Data Definition Language,即数据定义语言 ...
- Kratos漫游指南 1 - 概览
您好,地球人,欢迎来到Kratos漫游指南. 对于刚开始研究Kratos框架的开发者来说,目前的文档有些零散,这与我们的模块化设计有一些关系,不过Don't panic,从这篇文章开始,我将试图打破这 ...
- CentOS7.x安装VNC
VNC需要系统安装的有桌面,如果是生产环境服务器,安装时使用的最小化安装,那么进行下面操作安装GNOME 桌面. # 列出的组列表里有GNOME Desktop. yum grouplist #安装 ...
- 19. Fluentd输入插件:in_http用法详解
in_http插件允许使用HTTP协议来采集日志事件.这个插件会建立一个支持REST风格的HTTP端点,来接收日志事件请求. 配置示例 <source> @type http port 9 ...