• <fieldset id="8imwq"><menu id="8imwq"></menu></fieldset>
  • <bdo id="8imwq"><input id="8imwq"></input></bdo>
    最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
    問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
    當前位置: 首頁 - 科技 - 知識百科 - 正文

    vue里如何主動銷毀keep-alive緩存的組件

    來源:懂視網 責編:小采 時間:2020-11-27 21:59:49
    文檔

    vue里如何主動銷毀keep-alive緩存的組件

    vue里如何主動銷毀keep-alive緩存的組件:問題產生的背景 我們一個后臺,在切換一些標簽頁的時候,是使用的 keep-alive 緩存的標簽頁,也使用了 include 屬性來決定哪個頁面進行緩存,而標簽頁的切換實際上是路由的切換,也就是說打開一個新標簽頁的時候,url 會跟著變化,老的標簽頁如果在 keep
    推薦度:
    導讀vue里如何主動銷毀keep-alive緩存的組件:問題產生的背景 我們一個后臺,在切換一些標簽頁的時候,是使用的 keep-alive 緩存的標簽頁,也使用了 include 屬性來決定哪個頁面進行緩存,而標簽頁的切換實際上是路由的切換,也就是說打開一個新標簽頁的時候,url 會跟著變化,老的標簽頁如果在 keep

    問題產生的背景

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

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

    依賴環境

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

    定位問題

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

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

    當然,在這塊 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 來緩存組件中的數據,當需要重新顯示數據時再把數據取出來并重新渲染。當然,這是一個比較大的工程!

    聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

    文檔

    vue里如何主動銷毀keep-alive緩存的組件

    vue里如何主動銷毀keep-alive緩存的組件:問題產生的背景 我們一個后臺,在切換一些標簽頁的時候,是使用的 keep-alive 緩存的標簽頁,也使用了 include 屬性來決定哪個頁面進行緩存,而標簽頁的切換實際上是路由的切換,也就是說打開一個新標簽頁的時候,url 會跟著變化,老的標簽頁如果在 keep
    推薦度:
    標簽: 緩存 VUE 主動
    • 熱門焦點

    最新推薦

    猜你喜歡

    熱門推薦

    專題
    Top
    主站蜘蛛池模板: 精品露脸国产偷人在视频| 精品视频一区二区三区四区五区| 国产精品99精品视频网站| 精品无码av一区二区三区| 日批日出水久久亚洲精品tv| 欧美一区二区精品久久| 老汉精品免费AV在线播放| 欧美精品整片300页| 国产成人精品免费大全| 精品一区二区久久| 黑人巨大精品欧美| 尤物yw午夜国产精品视频| 精品成人av一区二区三区| 思思99热在线观看精品| 99视频在线观看精品| 久久精品天天中文字幕人妻| 亚洲精品国自产拍在线观看| 精品久久久久久久久久中文字幕 | 亚洲AV永久青草无码精品| 久久亚洲精品无码观看不卡| 国产日韩精品无码区免费专区国产| 麻豆精品成人免费国产片| 99久久国产热无码精品免费 | 欧美精品黑人粗大免费| 亚洲中文字幕久久精品无码APP | 亚洲精品无码久久一线| 亚洲情侣偷拍精品| 野狼第一精品社区| 日韩精品专区在线影院重磅| 日韩精品区一区二区三VR| 少妇人妻无码精品视频| 日韩精品久久久肉伦网站| 人妻精品久久久久中文字幕69 | 亚洲日韩中文在线精品第一| 香蕉国产精品麻豆亚洲欧美日韩精品自拍欧美v国 | 91精品福利在线观看| 91不卡在线精品国产| 国产精品粉嫩美女在线观看| 国产精品成人小电影在线观看 | 亚洲欧美日韩精品| 99久久伊人精品综合观看|