前端技術之:Vue.js應用回退或刷新界面時提示用戶保存修改

在實際應用中,運營人員在編輯數據時不但願因不當心點擊了瀏覽器的回退或刷新按鈕致使花費了很長時間編輯的數據丟失。能夠採用如下兩種手段防止運營編輯時丟失數據:html

  • 在運營人員刷新頁面或回退時,自動保留數據至瀏覽器端本地存儲,在從新進入編輯頁面時再將數據從本地存儲中加載到編輯界面。
  • 第二種方法是在運營人員刷新或回退時,強提示運營人員有修改的數據還沒有保存,詢問是否繼續。

無認採用哪種方式,在技術實現上,咱們須要首先可以監聽到用戶執行回退或刷新頁面的動做。前端

實際上,當用戶執行頁面刷新時,會觸發window對象上的onBeforeUnload事件。因此,咱們須要在頁面加載時開始監聽此事件。在Vue.js應用中,咱們能夠在Vue.js的mounted生命週期事件函數中開始監聽。vue

mounted() {
    window.onbeforeunload = e => {
      if (!this.modified) {
        return;
      }

      // 通知瀏覽器不要執行與事件關聯的默認動做
      e.preventDefault();
      // Chrome 須要 returnValue 被設置成空字符串
      e.returnValue = '';
    };
  },

有了以上的代碼,只要咱們在修改了數據之後,將modified的值改成true,則能夠在刷新整個頁面時彈出以下提示:vue-router

當用戶點擊上述對話框的[取消]按鈕後,會取消刷新動做,當用戶選擇[從新加載]後,瀏覽器會強制進行頁面的刷新。瀏覽器

因爲在Vue.js應用中,一般是一個頁面的應用,全部的子頁面享用一個window對象,因此,若是在一個Vue.js頁面組件中增長了對onBeforUnload事件的監聽,則可能會影響其它頁面組件的相關行爲,而在其餘頁面(如,僅瀏覽數據的頁面)是不但願進行相關的提示的,因此,咱們須要在Vue.js組件卸載的時候取消對onBeforeUnload事件的監聽。ide

destroyed() {
    // 取消對事件的監聽
    window.onbeforeunload = null;
  },

用戶除了經過瀏覽器刷新操做退出外,還有兩種可能的退出途徑:函數

  • 點擊瀏覽器的前進或回退操做按鈕
  • 點擊單頁面中的前端路由連接

對於以上兩種退出途徑,onBeforeLoad事件一般是攔截不到相應的事件的,由於這兩種操做通常是前端路由的行爲。ui

既然是前端路由的行爲,咱們就須要在前端路由事件上下功夫。可喜的是,前端路由vue-router爲咱們提供了導航守衛的能力。關於vue-router導航守衛的相關知識,你們能夠參考:vue-router前端路由導航守衛this

前端路由導航守衛分爲全局守衛、獨享守衛、組件內守衛等。這裏咱們使用的是組件內守衛。code

組件內守衛有如下三種

  • beforeRouteEnter 組件第一次被渲染時調用
  • beforeRouteUpdate 路由改變但組件被複用時調用
  • beforeRouteLeave 導航離開組件時調用

顯而易見,咱們須要監聽並處理beforeRouteLeave事件。

beforeRouteLeave(to, from, next) {
    if (!this.modified) {
      next();
      return;
    }

    this.$confirm('當前頁面數據未保存,肯定要離開?', '提示', { type: 'warning' })
      .then(() => {
        next();
      })
      .catch(() => {
        next(false);
      });
  },

有了以上的代碼,當咱們在進行路由切換時(點擊瀏覽器回退按鈕或點擊頁面中的其它路由連接)就會提示以下的對話框:

當用戶選擇取消時,回到原界面,當用戶點擊肯定按鈕後,頁面強制刷新。

>以上是本人在實際項目應用中遇到的問題及咱們採起的解決方案,若是您有更好的方法,或者有更好的建議,歡迎不吝賜教。
相關文章
相關標籤/搜索