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

溫馨提示×

溫馨提示×

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

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

vue里主動銷毀keep-alive緩存

發布時間:2021-02-05 11:41:36 來源:億速云 閱讀:1183 作者:小新 欄目:web開發

這篇文章給大家分享的是有關vue里主動銷毀keep-alive緩存的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

問題產生的背景

我們一個后臺,在切換一些標簽頁的時候,是使用的 keep-alive 緩存的標簽頁,也使用了 include 屬性來決定哪個頁面進行緩存,而標簽頁的切換實際上是路由的切換,也就是說打開一個新標簽頁的時候,url 會跟著變化,老的標簽頁如果在 keep-aliveinclude 范圍內那就會緩存下來。

然后客服人員就反饋頁面開的久了就會崩潰,因為他們基礎上不會刷新頁面(工作需要),又總有切換標簽的習慣,最后導致內存越來越大最后崩潰。

依賴環境

這個項目是基于一個開源 vue 后臺框架:https://github.com/PanJiaChen/vue-element-admin,然后代碼一直由幾個后端開發維護的!所以后端沒找出問題在哪,然后就我來接手這個問題了。
寫文章時,標簽里竟然沒有 vue 這一項,差評!

定位問題

先梳理下業務邏輯:從業務場景來說,我們在標簽頁之間切換時,如果剛進入的這個標簽頁已被緩存了,那被緩存的標簽頁就直接拿出來展示就行,而關閉這個標簽頁的時候就應該銷毀對應的組件。

vue里主動銷毀keep-alive緩存

花了點時間查看了一下代碼,發現問題在于關閉標簽頁的時候,雖然這個頁面沒在 keep-aliveinclude 里了,但是組件也沒有被銷毀掉,還是在緩存狀態,我們可以通過 Vue Devtools 插件看到關閉后的標簽頁對應的組件一直還存在著:

vue里主動銷毀keep-alive緩存

當然,在這塊 keep-alive 本身的邏輯我覺得是沒問題的,主要是我們項目比較復雜,緩存的組件太多了而且會一直增加,所以最終導致崩潰。

解決問題

既然問題已經定位了,那就好解決問題了,只需要在關閉標簽頁的時候把對應的組件也銷毀掉就好了。

經過網上一翻查找,發現銷毀一個組件可以使用: this.$destroy(‘組件名') 來銷毀。

先說下大概思路:keep-aliveinclude 里存的其實是一個 vuex 中的一個數據源(數據源保存的是路由名稱),當關閉標簽頁時,這個數據源中的一項會被移除。這之前,我們在組件里監聽到這個數據源的變化,如果此組件對應的路由(這個路由應在 mounted 的時候保存下來)已經不在數據源中了,那就應該銷毀此組件。

代碼大概如下:

const mixin = {
 data() {
  return {
   routePath: ''
  }
 },
 mounted() {
  this.routePath = this.$route.path
 },
 computed: {
  visitedViews() {
   return this.$store.state.tagsView.visitedViews
  }
 },
 watch: {
  visitedViews(value) {
   if(value 里沒有了 routePath 這一項)
    this.$destroy(this.$options.name)
   }
  }
 }
}

export default mixin

這一段代碼單獨拎出來了,然后在需要緩存的組件里使用 mixins 混入到組件對象中,這樣組件中要添加的代碼量就比較少了。

更改后經過測試,關閉標簽頁后對應的組件就會被銷毀掉,使用 Vue Devtools 能看的很清楚。

更多思考

在我們后臺操作這么頻繁的業務場景下,使用 keep-alive 其實并不是一個好的選擇。

在我們修復這個問題后,我們通過控制臺里的 Memory 查看頁面內存的變化時,發現組件即便被銷毀,也要經過一段時間才能回收完,當我們在這一段時間一直創建/打開新的標簽頁時,內存還是會在短時間內高漲。而且有時候,內存在經過一段時間后也并沒有回收掉。

keep-alive 本質上是把整個 dom 節點及對應的事件等都緩存下來了,當這樣的組件很多的時候,自然會占用很多內存。而如果我們只緩存這個組件中的數據,在需要這個組件再次顯示的時候再臨時渲染那肯定要節省很多內存的,畢竟數據占的空間其實很小的,而渲染組件要花的時間也不會很長(只要組件不是特別特別復雜)。

所以,下一階段的優化工作就是把 keep-alive 去掉,然后使用 vuex 來緩存組件中的數據,當需要重新顯示數據時再把數據取出來并重新渲染。當然,這是一個比較大的工程!

感謝各位的閱讀!關于“vue里主動銷毀keep-alive緩存”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節

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

AI

承德县| 澎湖县| 寿光市| 普安县| 遵义县| 吉木萨尔县| 长汀县| 永康市| 武山县| 通榆县| 久治县| 年辖:市辖区| 建水县| 名山县| 政和县| 贵港市| 丹寨县| 阆中市| 和静县| 克拉玛依市| 满城县| 弋阳县| 海丰县| 商丘市| 科尔| 大方县| 漳平市| 南京市| 论坛| 潼关县| 綦江县| 长岭县| 静安区| 临江市| 潞城市| 仁寿县| 武川县| 县级市| 和林格尔县| 迭部县| 九台市|