戴尔官方工具制作恢复教程外星人采用与
94 2024-04-20
组件级别的路由钩子,全局和单个路由独享的
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('当前页面数据未保存,确定要离开![image](http://note.youdao.com/favicon.ico)?') 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 }
显示的提示框如下:
总结
最后在 和 的共同作用下,完美解决了刷新、跳转、关闭时需要提醒保存的问题! 而且,还有一点遗憾,就是命中框的自定义提示设置一直没有生效。 如果大家有更合适的方案,欢迎交流,见谅!
以上就是本文的全部内容。 希望对大家的学习有所帮助,希望大家多多支持脚本之家。