vue单页面实现当前页面刷新或跳转时提示保存

  

<强>前言
  

  

最近公司vue项目中有一个需求,需要在当前页面刷新或跳转时提示保存并可取消刷新,以防止填写的表单内容丢失。刚开始思考觉得很简单,直接在路由器的钩子中判断就好了,但是会发现还有新的问题存在,浏览器刷新和当前页面关闭的时候无法监听,最终用窗口。onbeforeunload成功解决,所以用这篇文章简单记录下整个解决过程。
  

  

<强> vue-Router的钩子:
  

  

路由钩子可以分为全局的,单个路由独享的以及组件级别的,解决上述需求只用到了组件级别的路由钩子,所以本文只介绍组件级别的路由钩子,全局的和单个路由独享的路由钩子有需要的同学可以去vue-router官网查看介绍:

  

组件级别路由钩子分为三种:

  
      <李> beforeRouteEnter:当成功获取并能进入路由(在渲染该组件的对应路由被确认前)   <李> beforeRouteUpdate:在当前路由改变,但是该组件被复用时调用李   <李> beforeRouteLeave:导航离开该组件的对应路由时调用李   
  

具体的介绍和写法如下:

        const Foo={   模板:“……”   beforeRouteEnter(下),从{//在渲染该组件的对应路由被确认前调用//不!能获取组件实例“这”//因为当守卫执行前,组件实例还没被创建//可以通过传一个回调给下一个来访问组件实例   下(vm=比;{//通过vm的访问组件实例   })   },   beforeRouteUpdate(下),从{//在当前路由改变,但是该组件被复用时调用//举例来说,对于一个带有动态参数的路径/foo/: id,在/foo/1和/foo/2之间跳转的时候,//由于会渲染同样的Foo组件,因此组件实例会被复用。而这个钩子就会在这个情况下被调用。//可以访问组件实例“这”//不支持传递回调(因这为实例已经创建可以获取到,所以没必要)   next ()   },   beforeRouteLeave(下),从{//导航离开该组件的对应路由时调用//可以访问组件实例“这”//该导航可以通过下一个(false)来取消。   const回答=窗口。确认(“你真的想离开# 63;您有未保存的更改!”)   如果(回答){   next ()   其他}{//不支持传递回调(因这为实例已经创建可以获取到,所以没必要)   下(错误)   }   }   }   之前      

注意:在刷新当前页面时候,beforeRouteLeave不会触发,它只在进入到其他页面时候才会触发,但是beforeRouteEnter会在刷新的时候触发。

  

通过beforeRouteLeave这个路由钩子,我们就可以在用户要离开此页面时候进行提示了!

        beforeRouteLeave(下),从{   const回答=window.confirm(“当前页面数据未保存,确定要离开![图片](http://note.youdao.com/favicon.ico)吗?”)   如果(回答){   next ()   其他}{   下(错误)   }   }   之前      

显示的提示框如下:

  

 vue单页面实现当前页面刷新或跳转时提示保存

  

<>强监听浏览器的刷新,页面关闭事件
  

  

但是,这个时候就实现了我们最终的需求了么?并没有,还有一步:用window.onbeforeunload监听浏览器的刷新事件,当然为了防止从当前单页面跳到其他页面之后,在刷新所在新的页面还会触发窗口上的onbeforeunload的问题,我们不仅要及时的添加onbeforeunload事件,更要及时删除此事件、下面有两种解决方法可供选择:

  

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

        安装(){   窗口。onbeforeunload=function (e) {   如果(_this。美元的路线。fullPath==/布局/添加){   e=e | | window.event;//兼容IE8和火狐4之前的版本   如果(e) {   e。returnValue=' https://www.yisu.com/zixun/关闭提示';   }//铬,Safari浏览器,Firefox 4 +,歌剧12 +,IE 9 +   返回“关闭提示';   其他}{   窗口。onbeforeunload=零   }   }   };   之前      

在毁坏或者beforeDestory的生命周期中直接将onbeforeunload事件置空
  

        安装(){   窗口。onbeforeunload=function (e) {   e=e | | window.event;//兼容IE8和火狐4之前的版本   如果(e) {   e。returnValue=' https://www.yisu.com/zixun/关闭提示';   }//铬,Safari浏览器,Firefox 4 +,歌剧12 +,IE 9 +   返回“关闭提示';   }   };   摧毁了(){   窗口。onbeforeunload=零   }   

vue单页面实现当前页面刷新或跳转时提示保存