如何在Vue.js 2应用程序中模仿onbeforeunload?

时间:2019-06-11 18:57:25

标签: javascript vue.js vuejs2 vue-router

我有一个Vue组件,它在“脏”(例如未保存)时进行跟踪。如果用户有未保存的数据,我想在他们离开当前表单之前警告用户。在典型的Web应用程序中,您可以使用onbeforeunload。我试图像这样在挂载中使用它:

mounted: function(){
  window.onbeforeunload = function() {
    return self.form_dirty ? "If you leave this page you will lose your unsaved changes." : null;
  }
}

但是,在使用Vue Router时,这不起作用。它可以让您向下浏览任意数量的路由器链接。一旦您尝试关闭窗口或导航到 real 链接,就会警告您。

是否可以在Vue应用程序中为普通链接和路由器链接复制onbeforeunload

1 个答案:

答案 0 :(得分:0)

beforeRouteLeave in-component guardonbeforeunload事件一起使用。

  

请假护板通常用于防止用户意外   保留未保存的修改路线。导航可以取消   通过调用next(false)。

在组件定义中执行以下操作:

beforeRouteLeave (to, from, next) {
  // If the form is not dirty or the user confirmed they want to lose unsaved changes,
  // continue to next view
  if (!this.form_dirty || this.confirmLeave()){
    next()
  } else {
    // Cancel navigation
    next(false)
  }
},

created() {
  window.addEventListener('beforeunload', this.onBeforeUnload)
},

beforeDestroy() {
  window.removeEventListener('beforeunload', this.onBeforeUnload)
},

methods: {
  onBeforeUnload(e) {
    if (this.form_dirty && !this.confirmLeave()) {
      // Cancel the event
      e.preventDefault()
      // Chrome requires returnValue to be set
      e.returnValue = ''
    }   
  },

  confirmLeave() {
    return window.confirm('Do you really want to leave? you have unsaved changes!')
  }, 
},

我尚未对此进行测试,MDN说:

  

在某些浏览器中,调用window.alert(),window.confirm()和   在此事件期间,window.prompt()可能会被忽略。见HTML   详细说明。