组件级别的路由钩子,全局和单个路由独享的

2023-05-09 15:23

组件级别的路由钩子,全局和单个路由独享的

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)
 }
 }

显示的提示框如下:

vue离开页面触发事件_vue 获取当前时间_vue 离开当前页面提示

窃听浏览器刷新和页面关闭

然而,此时我们的最终需求是否实现了呢? 不,还有一个步骤:使用 . 窃听浏览器的刷新干扰。 事实上,为了避免从当前单页跳转到其他页面后刷新新页面时会触发的问题,除了及时添加扰动外,​​更需要及时删除这个扰动。 有两种解决方案可供选择:

通过判断其路由当前是否为需要添加的严禁刷新的页面

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
 }

显示的提示框如下:

vue 离开当前页面提示_vue离开页面触发事件_vue 获取当前时间

总结

最后在 和 的共同作用下,完美解决了刷新、跳转、关闭时需要提醒保存的问题! 而且,还有一点遗憾,就是命中框的自定义提示设置一直没有生效。 如果大家有更合适的方案,欢迎交流,见谅!

以上就是本文的全部内容。 希望对大家的学习有所帮助,希望大家多多支持脚本之家。

下一篇:新能源智慧驾培园区启用“人车对话”即可指导学员练车
上一篇:把真实世界中千变万化的环境一比一“搬”进虚拟世界
相关文章
返回顶部小火箭