溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

前端技術(shù)之:Vue.js應(yīng)用回退或刷新界面時(shí)提示用戶保存修改

發(fā)布時(shí)間:2020-06-27 01:31:10 來源:網(wǎng)絡(luò) 閱讀:919 作者:popgis 欄目:web開發(fā)

在實(shí)際應(yīng)用中,運(yùn)營(yíng)人員在編輯數(shù)據(jù)時(shí)不希望因不小心點(diǎn)擊了瀏覽器的回退或刷新按鈕導(dǎo)致花費(fèi)了很長(zhǎng)時(shí)間編輯的數(shù)據(jù)丟失??梢圆捎靡韵聝煞N手段防止運(yùn)營(yíng)編輯時(shí)丟失數(shù)據(jù):

  • 在運(yùn)營(yíng)人員刷新頁面或回退時(shí),自動(dòng)保留數(shù)據(jù)至瀏覽器端本地存儲(chǔ),在重新進(jìn)入編輯頁面時(shí)再將數(shù)據(jù)從本地存儲(chǔ)中加載到編輯界面。
  • 第二種方法是在運(yùn)營(yíng)人員刷新或回退時(shí),強(qiáng)提示運(yùn)營(yíng)人員有修改的數(shù)據(jù)尚未保存,詢問是否繼續(xù)。

無認(rèn)采用哪一種方式,在技術(shù)實(shí)現(xiàn)上,我們需要首先能夠監(jiān)聽到用戶執(zhí)行回退或刷新頁面的動(dòng)作。

實(shí)際上,當(dāng)用戶執(zhí)行頁面刷新時(shí),會(huì)觸發(fā)window對(duì)象上的onBeforeUnload事件。所以,我們需要在頁面加載時(shí)開始監(jiān)聽此事件。在Vue.js應(yīng)用中,我們可以在Vue.js的mounted生命周期事件函數(shù)中開始監(jiān)聽。

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

      // 通知瀏覽器不要執(zhí)行與事件關(guān)聯(lián)的默認(rèn)動(dòng)作
      e.preventDefault();
      // Chrome 需要 returnValue 被設(shè)置成空字符串
      e.returnValue = '';
    };
  },

有了以上的代碼,只要我們?cè)谛薷牧藬?shù)據(jù)以后,將modified的值改為true,則可以在刷新整個(gè)頁面時(shí)彈出如下提示:

前端技術(shù)之:Vue.js應(yīng)用回退或刷新界面時(shí)提示用戶保存修改

當(dāng)用戶點(diǎn)擊上述對(duì)話框的[取消]按鈕后,會(huì)取消刷新動(dòng)作,當(dāng)用戶選擇[重新加載]后,瀏覽器會(huì)強(qiáng)制進(jìn)行頁面的刷新。

由于在Vue.js應(yīng)用中,通常是一個(gè)頁面的應(yīng)用,所有的子頁面享用一個(gè)window對(duì)象,所以,如果在一個(gè)Vue.js頁面組件中增加了對(duì)onBeforUnload事件的監(jiān)聽,則可能會(huì)影響其它頁面組件的相關(guān)行為,而在其他頁面(如,僅瀏覽數(shù)據(jù)的頁面)是不希望進(jìn)行相關(guān)的提示的,所以,我們需要在Vue.js組件卸載的時(shí)候取消對(duì)onBeforeUnload事件的監(jiān)聽。

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

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

  • 點(diǎn)擊瀏覽器的前進(jìn)或回退操作按鈕
  • 點(diǎn)擊單頁面中的前端路由鏈接

對(duì)于以上兩種退出途徑,onBeforeLoad事件通常是攔截不到相應(yīng)的事件的,因?yàn)檫@兩種操作一般是前端路由的行為。

既然是前端路由的行為,我們就需要在前端路由事件上下功夫??上驳氖牵岸寺酚蓈ue-router為我們提供了導(dǎo)航守衛(wèi)的能力。關(guān)于vue-router導(dǎo)航守衛(wèi)的相關(guān)知識(shí),大家可以參考:vue-router前端路由導(dǎo)航守衛(wèi)。

前端路由導(dǎo)航守衛(wèi)分為全局守衛(wèi)、獨(dú)享守衛(wèi)、組件內(nèi)守衛(wèi)等。這里我們使用的是組件內(nèi)守衛(wèi)。

組件內(nèi)守衛(wèi)有以下三種

  • beforeRouteEnter 組件第一次被渲染時(shí)調(diào)用
  • beforeRouteUpdate 路由改變但組件被復(fù)用時(shí)調(diào)用
  • beforeRouteLeave 導(dǎo)航離開組件時(shí)調(diào)用

顯而易見,我們需要監(jiān)聽并處理beforeRouteLeave事件。

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

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

有了以上的代碼,當(dāng)我們?cè)谶M(jìn)行路由切換時(shí)(點(diǎn)擊瀏覽器回退按鈕或點(diǎn)擊頁面中的其它路由鏈接)就會(huì)提示如下的對(duì)話框:

前端技術(shù)之:Vue.js應(yīng)用回退或刷新界面時(shí)提示用戶保存修改

當(dāng)用戶選擇取消時(shí),回到原界面,當(dāng)用戶點(diǎn)擊確定按鈕后,頁面強(qiáng)制刷新。

>以上是本人在實(shí)際項(xiàng)目應(yīng)用中遇到的問題及我們采取的解決方案,如果您有更好的方法,或者有更好的建議,歡迎不吝賜教。
向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI