中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

怎么在Vue中實現路由快照

發布時間:2021-05-31 18:09:19 來源:億速云 閱讀:152 作者:Leah 欄目:web開發

這篇文章將為大家詳細講解有關怎么在Vue中實現路由快照,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

// router-snapshot.js
// https://github.com/dankogai/js-base64
import { Base64 } from 'js-base64';

function beforeRouteEnterHandler (vm, {key, ext}) {
 // 獲取路由綁定字段
 const routeBindKeys = vm.$options[ext] || [];
 // 獲取路由綁定部分的加密字符串
 const routeParamsString = vm.$route.query[key];
 // 解密并轉換為JSON
 let routeParamsJSON;
 try {
  routeParamsJSON = JSON.parse(Base64.decode(routeParamsString));
 }catch (e) {
  routeParamsJSON = {};
 }
 routeBindKeys.forEach(attr => {
  // 使用vue的是指方式,若瀏覽器沒有緩存值,則獲取組件默認值
  vm.$set(vm, attr, routeParamsJSON.hasOwnProperty(attr) ? routeParamsJSON[attr] : vm[attr]);
  // 追加屬性反向監聽,監聽到的屬性變化都會呈現在路由上
  vm.$watch(attr, (value) => {
   const query = vm.$route.query;
   let routeSnapshotValueJSON;
   try {
    routeSnapshotValueJSON = JSON.parse(Base64.decode(query[key]));
   }catch (e) {
    routeSnapshotValueJSON = {};
   }
   routeSnapshotValueJSON[attr] = value;
   const extendQuery = {};
   extendQuery[key] = Base64.encodeURI(JSON.stringify(routeSnapshotValueJSON));
   vm.$router.push({
    query: { 
     ...query,
     ...extendQuery
    }
   })
  }, {
   deep: true
  });
 })
}

export default {
 install (Vue, {key = '_', ext = 'routeShot'} = {}) {
  Vue.mixin({
   // beforeRouteEnter (to, from, next) {
   //  console.log('beforeRouteEnter', to, from)
   //  next(beforeRouteEnterHandler)
   // }
   created () {
    beforeRouteEnterHandler(this, {key, ext});
   }
  });
 }
}

代碼邏輯大致如下:

  1. 代碼45行,注冊該組件時,我們需要指定保存在URL query部分的鍵名,默認為_;同時指定綁定在組件上的拓展屬性名,默認為routeShot;

  2. 代碼21行,根據組件拓展屬性,對這些拓展屬性實施監聽,將屬性值的變化同步到路由中;

  3. 代碼19行,在組件created階段,獲取路由參數并解析成組件屬性,并將屬性值同步到組件中;

  4. 代碼13、25、31行對路由上的參數進行Base64的加密和解密;

組件的代碼僅僅需要追加routeShot的配置即可:

<template>
  <!-- 使用的iview庫的Switch組件 -->
  <Switch v-mode="switchValue"></Switch>
</template>
<script>
 export default {
  // 配置routeShot,指定該組件的switchValue屬性映射到URL中
  routeShot: ['switchValue'],
  data () {
   return {
    switchValue: false
   }
  }
 }
</script>

經過這樣,無論你怎么刷新頁面,被快照的屬性都不會發生改變。另外,除了data屬性,prop、computed屬性也是可以綁定到URL上的。

什么時候用最適合?

目前來說,應用場景中最多的還是非安全性表單以及不需要持久化的數據。舉幾個例子:

  1. 表格中篩選項有很多的情況下,用戶進行了大量的選擇和填寫操作,結果因為網絡原因導致請求失敗。待網絡恢復后,用戶重新刷新頁面,先前的操作必須重新執行;一般情況中,用戶不會隨意更改瀏覽器的URL,在這種條件下,用戶的刷新不影響上下文的環境,能給用戶帶來一定便利;

  2. 之前代碼示例中,開關組件的值不交予服務端進行持久化,也是可以使用這種方式來保存操作的;

存在的問題

寫完這個插件,面臨了三個我認為比較重要的問題:

  1. 性能問題: 通過代碼47-50行可以看出,早期設計是將插件應用在路由組件中的,但是在后期的測試和使用中,發現還有很多組件不是注冊在路由中的,也就是父子組件,這樣的組件無法被路由鉤子攔截到,因此就將該函數混入到了所有組件的created函數中。當應用越來越大、組件越來越多的時候,這個性能未免有點令人擔憂;

  2. 持久性問題: 當URL的query部分越來越大的時候,超過了URL的長度限制,那么組件屬性的持久性將會被中斷。但我們并不能保證該長度不會超過,這隨著應用的增長是無法預料的。在前端中,我們沒有找到對應的庫能進行定長加密解密,如果能找到,這個或將被解決;

  3. 安全性問題: 一直找不到比較安全的加密解密方式,而且我覺得這樣做是會有安全隱患,但不知道究竟哪種場景會讓這種安全性問題暴露的最大;

關于怎么在Vue中實現路由快照就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

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

vue
AI

加查县| 兰溪市| 浦北县| 轮台县| 天津市| 措勤县| 吴桥县| 松潘县| 伊通| 新化县| 台南县| 岳西县| 六枝特区| 汉寿县| 乌什县| 宿迁市| 清流县| 禹州市| 嘉祥县| 清镇市| 惠来县| 禄丰县| 桂林市| 新乡县| 寻乌县| 合肥市| 崇礼县| 吐鲁番市| 湄潭县| 黄梅县| 扶余县| 砀山县| 雷波县| 武冈市| 翼城县| 开江县| 盐城市| 双流县| 昌黎县| 嘉善县| 安义县|