组件级别的路由钩子,全局和单个路由独享的
组件级别的路由钩子,全局和单个路由独享的
vue单页实现当前页面刷新或跳转时提示保存
更新时间:2018-01-02 10:41:35 作者:
本文主要介绍vue单页实现当前页面刷新或跳转时提示保存。 当前页面刷新或跳转时,提示保存,可以取消刷新,避免填写的表单内容丢失。 有兴趣的男伴可以仅供参考
前言
最近在公司的vue项目中有一个需求vue 离开当前页面提示,需要在当前页面刷新或者跳转的时候,提示保存并取消刷新,避免填写的表单内容丢失。 一开始想的很简单,直接在钩子里判断就可以了,你会发现又有新的问题了。 刷新浏览器和关闭当前页面时很难窃听。 最后,使用 . 为了成功解决,所以用这篇文章简单记录一下整个解决过程。
vue 钩子:
路由钩子分为全局的、单路由独占的和组件级的。 只使用组件级路由钩子来解决以上需求,所以本文只介绍组件级路由钩子,全局和单路由独享路由钩子有需要的朋友可以去vue-官网查看介绍:
组件级路由钩子分为三种类型:
: 获取成功并可以进入路由时(组件对应路由渲染前): 当前路由发生变化vue 离开当前页面提示,组件重用时调用: 导航离开组件对应路由时调用
具体介绍和写作如下:
const Foo = {
template: `...`,
beforeRouteEnter (to, from, next) {
// 在渲染该组件的对应路由被 confirm 前调用
// 不!能!获取组件实例 `this`
// 因为当守卫执行前,组件实例还没被创建
// 可以通过传一个回调给 next来访问组件实例
next(vm => {
// 通过 `vm` 访问组件实例
})
},
beforeRouteUpdate (to, from, next) {
// 在当前路由改变,但是该组件被复用时调用
// 举例来说,对于一个带有动态参数的路径 /foo/:id,在 /foo/1 和 /foo/2 之间跳转的时候,
// 由于会渲染同样的 Foo 组件,因此组件实例会被复用。而这个钩子就会在这个情况下被调用。
// 可以访问组件实例 `this`
// 不支持传递回调(因为this实例已经创建可以获取到,所以没必要)
next()
},
beforeRouteLeave (to, from, next) {
// 导航离开该组件的对应路由时调用
// 可以访问组件实例 `this`
// 该导航可以通过 next(false) 来取消。
const answer = window.confirm('Do you really want to leave? you have unsaved changes!')
if (answer) {
next()
} else {
// 不支持传递回调(因为this实例已经创建可以获取到,所以没必要)
next(false)
}
}
}
注意:当前页面刷新时不会触发,只能在进入其他页面时触发,刷新时触发。
通过这个路由钩子,我们可以在用户要离开这个页面时进行提示!
beforeRouteLeave (to, from, next) {
const answer = window.confirm('当前页面数据未保存,确定要离开?')
if (answer) {
next()
} else {
next(false)
}
}
显示的提示框如下:

窃听浏览器刷新和页面关闭
然而,此时我们的最终需求是否实现了呢? 不,还有一个步骤:使用 . 窃听浏览器的刷新干扰。 事实上,为了避免从当前单页跳转到其他页面后刷新新页面时会触发的问题,除了及时添加扰动外,更需要及时删除这个扰动。 有两种解决方案可供选择:
通过判断其路由当前是否为需要添加的严禁刷新的页面
mounted() {
window.onbeforeunload = function (e) {
if(_this.$route.fullPath =="/layout/add"){
e = e || window.event;
// 兼容IE8和Firefox 4之前的版本
if (e) {
e.returnValue = '关闭提示';
}
// Chrome, Safari, Firefox 4+, Opera 12+ , IE 9+
return '关闭提示';
}else{
window.onbeforeunload =null
}
}
};
直接清空or生命周期中的风暴
mounted() {
window.onbeforeunload = function (e) {
e = e || window.event;
// 兼容IE8和Firefox 4之前的版本
if (e) {
e.returnValue = '关闭提示';
}
// Chrome, Safari, Firefox 4+, Opera 12+ , IE 9+
return '关闭提示';
}
};
destroyed() {
window.onbeforeunload = null
}
显示的提示框如下:

总结
最后在 和 的共同作用下,完美解决了刷新、跳转、关闭时需要提醒保存的问题! 而且,还有一点遗憾,就是命中框的自定义提示设置一直没有生效。 如果大家有更合适的方案,欢迎交流,见谅!
以上就是本文的全部内容。 希望对大家的学习有所帮助,希望大家多多支持脚本之家。
