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 ...
随机推荐
- “判断性别”Demo需求分析和初步设计(中)
大家好~我开设了"深度学习基础班"的线上课程,带领同学从0开始学习全连接和卷积神经网络,进行数学推导,并且实现可以运行的Demo程序 线上课程资料: 本节课录像回放 加QQ群,获得 ...
- CSP2021-S游记
前言 年纪大了,脑子乱了,渐渐被低年级吊打了. 大家这么内卷下去,高年级的普遍后悔自己生早了,低年级永远占优势,不只是机会优势,还有能力优势. 快进到改变基因出生国家队算了-- Day0 非常不幸地被 ...
- 1.2_Selenium的三生三世
- 第一章 kubernetes概述
一.Kubernetes概述 1.官网地址:https://kubernetes.io 2.GuiHub:https://github.com/kubernetes/kubernetes 3.又来:谷 ...
- docker_命令总结
docker -v /hostDir:/containerDir /hostDir为宿主机的目录 /containerDir为容器内的目录 -v 实现两个目录的挂在,即容器内数据持久化到本机 dock ...
- webpack打包优化点
目录 1. noParse 2. 包含和排除目录 3. IgnorePlugin 4. happypack 5. DllPlugin动态链接库 6. 热更新 7. 开发环境 tree-shaking ...
- 回溯剪枝,dfs,bfs
dfs: 给定一个整数n,将数字1~n排成一排,将会有很多种排列方法. 现在,请你按照字典序将所有的排列方法输出. 输入格式 共一行,包含一个整数n. 输出格式 按字典序输出所有排列方案,每个方案占一 ...
- 手把手教你用Java获取IP归属地
前几个月微信公众号上线了IP归属地的功能,后续知乎.抖音等平台纷纷添加了该功能.如果是国内的用户精确到省份,国外用户精确到国家.本文就使用Java实现获取IP归属地. ! 主要讲解几个步骤: Java ...
- Kubernetes 配置管理
ConfigMap(可变配置管理) 对于应用的可变配置在 Kubernetes 中是通过一个 ConfigMap 资源对象来实现的,我们知道许多应用经常会有从配置文件.命令行参数或者环境变量中读取一些 ...
- MySQL 安装(二进制版)
MySQL 的安装方式一般分为三种,二进制版本.编译版本.RPM 包.比较常见的是二进制版本安装,方便简单,相对于编译安装,如果不是追求极致性能,使用起来差别不大.本次教程以二进制版本为例,系统为 c ...