国产99久久精品_欧美日本韩国一区二区_激情小说综合网_欧美一级二级视频_午夜av电影_日本久久精品视频

最新文章專題視頻專題問答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国产精品久久久久久久... | 成人黄色在线 | 国产中文在线 | 亚洲视频第一页 | 国产精品九九久久精品女同 | 亚洲一区二区综合 | 欧美高清一区二区三区欧美 | 欧美 国产 日韩 第一页 | 日韩精品在线第一页 | 亚洲国产成人久久一区www | 全黄a一级毛片 | 国产高清在线免费视频 | 久久伊人网视频 | 国产成人高清一区二区私人 | 国产网站精品 | 亚洲精品成人久久 | 国产成人综合久久 | 欧美日韩一区二区三区视频 | 亚洲国产成人久久一区www | 看全色黄大色大片免费久久 | 全免费一级午夜毛片 | 亚洲欧美日韩精品高清 | 艹久久 | 亚洲一区中文字幕在线观看 | 国内精品在线播放 | 国产精品91av | 久久99精品国产麻豆宅宅 | 亚洲视频免费在线观看 | 成人99国产精品一级毛片 | 在线观看日韩欧美 | 欧洲精品欧美精品 | 精品视频在线观看视频免费视频 | 91精品一区二区三区在线观看 | 国产精品成人一区二区三区 | 久久久久久综合成人精品 | 欧美亚洲综合另类在线观看 | 成人国产精品一区二区网站 | xxx欧美888 | 精品久久久久久国产牛牛app | 在线国产视频 | 国产高清在线看 |