91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Vue 路由返回恢復頁面狀態的操作方式

發布時間:2021-07-13 13:51:59 來源:億速云 閱讀:294 作者:chen 欄目:開發技術

這篇文章主要介紹“Vue 路由返回恢復頁面狀態的操作方式”,在日常操作中,相信很多人在Vue 路由返回恢復頁面狀態的操作方式問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Vue 路由返回恢復頁面狀態的操作方式”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

路由參數、路由導航守衛:頁面后退返回時,保留搜索結果

需求場景:首頁搜索內容,點擊跳轉至詳情頁,頁面后退返回主頁,保留搜索結果。

方案:路由參數;路由守衛

需求描述

在使用 Vue 開發前端的時候遇到一個場景:在首頁進行一些數據搜索,點擊搜索結果進入詳情頁面,瀏覽詳情頁后返回主頁。但這時候之前的搜索記錄和翻頁就消失了,用戶體驗不好。所以需要在返回后恢復跳轉前的頁面參數狀態。

當然如果條件允許,最簡單的辦法是點擊搜索結果使用新頁面打開(例如百度那樣)。但當前需求是一個完整的Vue開發的項目,并不是打開站外地址,而且詳情的內容也不多,使用新頁面不太合適(性能較差而且容易制造巨量標簽頁)。

這里介紹兩種比較容易實現的解決方案:

  • 方案一:將搜索參數存儲在路由參數(route.query)中,加載頁面時根據參數搜索

優點:刷新不影響;實現簡單

缺點:參數只能是基礎類型、長度受限;路徑看起來比較難看;只對瀏覽器返回有效,手動跳轉回首頁不行

  • 方案二:使用路由守衛鉤子,在離開頁面前本地存儲頁面參數(vuex、Local Storage 等等)

優點:參數類型長度都比較自由;路徑看起來清爽美觀;對任意方式返回主頁都有效

缺點:需要額外進行數據存儲操作,如果使用store模式或vuex則刷新頁面失效

方案一:路由參數

如果參數不多,并且不介意在路徑后面有一大串參數(流下強迫癥的淚水),可以直接把參數放在路由路徑里(比如百度就是這樣:baidu.com/s?wd=abc&rsv_spt=1&rsv_iqid=0x8a76279a000e2979&...,可以看到,確實是很長的一大串)。

在點擊搜索后,使用 vue router 進行跳轉并傳參:

// 搜索頁面

search(param) {
  // 其他處理
  this.$router.push({
      name: "Index",
      query: { ...this.queryParam },	// 將對象展開為鍵值
  });
},

這里要注意 query 傳參和 params 傳參的區別:前者的參數會以 ?k1=v1&k2=v2 的形式續在路徑后面,能直接在地址欄中看到,因此不受頁面跳轉、刷新影響;后者只在第一次跳轉到對應頁面時起作用,再刷新跳轉就沒有了。因此這里要使用 query 傳參。如果把參數按照格式手動寫在 path 中也是可以的,但易讀性和擴展性明顯更差,除非只有一兩個簡單參數,否則不推薦。

另外,由于這個參數是要放進路徑里的,因此只能是基本類型的鍵值對,數組或對象不能很好地支持。如果參數簡單,可以將相應的對象展開當做參數(需要保證不同對象中沒有重名鍵),但在跳轉到的搜索結果頁面中讀取時,就只能逐個屬性的獲取。

// 搜索結果頁面

mounted() {
  // 區分 $route 和 $router
  if (this.$route.query.type) {
    let type = this.$route.query.type;
    let keyword = this.$route.query.keyword;
    // ...逐一獲取各個參數
    // 進行搜索操作
  } else {
    // 沒有搜索參數(因為我這搜索結果和主頁是同一個頁面,所以有可能只是正常打開主頁)
  }
},

方案二:本地存儲參數

由于我這想存的參數是三個對象,展開成鍵值取著又太不方便,所以使用了這種方案。由于項目里本來也使用了 vuex,就順便存在了 vuex 里面,根據實際情況存在哪兒都行。vuex 的缺點是一刷新就刷沒了,對于搜索結果這種優化體驗性質的功能影響不大;如果有對應需求可以存在 local storage 里面。

因為我的需求中有很多中方式改變參數,在改變時存儲參數太麻煩,而且容易出錯或遺漏。因此這里選擇在路由跳轉之前再統一存儲所需參數。

Vue Router 提供了路由導航守衛系列 API 來實現相應功能,具體包括全局的前置/解析/后置守衛、路由配置守衛、組件守衛等方式。所謂”守衛“,其實相當于渲染過程中的”鉤子“,與熟悉的 created, mounted 一樣。

完整的導航解析流程:

  1. 導航被觸發。

  2. 在失活的組件里調用 beforeRouteLeave 守衛。

  3. 調用全局的 beforeEach 守衛。

  4. 在重用的組件里調用 beforeRouteUpdate 守衛 (2.2+)。

  5. 在路由配置里調用 beforeEnter

  6. 解析異步路由組件。

  7. 在被激活的組件里調用 beforeRouteEnter

  8. 調用全局的 beforeResolve 守衛 (2.5+)。

  9. 導航被確認。

  10. 調用全局的 afterEach 鉤子。

  11. 觸發 DOM 更新。

  12. 調用 beforeRouteEnter 守衛中傳給 next 的回調函數,創建好的組件實例會作為回調函數的參數傳入。

顯然,這里使用 beforeRouteLeave 鉤子就能很好地滿足要求:

// 搜索結果頁面

beforeRouteLeave(to, from, next) {
  // vuex 存儲操作
  this.$store.commit("updateRevert", {
    query: this.queryParam,
    page: this.pageParam,
    filter: this.filter,
  });
  next();	// 繼續后續的導航解析過程
},

加載頁面時檢查是否有保存的參數,有的話進行相應恢復操作:

// 搜索結果頁面

mounted() {
  // 判斷 vuex 中是否有保存的搜索參數
  if (this.$store.state.revert) {
    const revert = this.$store.state.revert;
    this.queryParam = revert.query;
    this.pageParam = revert.page;	// 可以直接取出整個對象
    // 搜索操作
  } else {
    // 沒有搜索參數(因為我這搜索結果和主頁是同一個頁面,所以有可能只是正常打開主頁)
  }
},

到此,關于“Vue 路由返回恢復頁面狀態的操作方式”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

vue
AI

深州市| 乌拉特中旗| 百色市| 利辛县| 贞丰县| 台北县| 鄂托克旗| 巴林右旗| 龙海市| 吴桥县| 祁连县| 陆丰市| 泰兴市| 西安市| 三明市| 海伦市| 个旧市| 四子王旗| 洛阳市| 静宁县| 中牟县| 民乐县| 安达市| 荆州市| 定日县| 盐池县| 准格尔旗| 邳州市| 浮梁县| 济宁市| 玉门市| 塘沽区| 广宗县| 皮山县| 修文县| 长顺县| 清涧县| 高青县| 二连浩特市| 井陉县| 武鸣县|