日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
vue里主動銷毀keep-alive緩存-創(chuàng)新互聯(lián)

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

成都創(chuàng)新互聯(lián)于2013年成立,先為鹽邊等服務(wù)建站,鹽邊等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為鹽邊企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。

問題產(chǎn)生的背景

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

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

依賴環(huán)境

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

定位問題

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

vue里主動銷毀keep-alive緩存

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

vue里主動銷毀keep-alive緩存

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

解決問題

既然問題已經(jīng)定位了,那就好解決問題了,只需要在關(guān)閉標(biāo)簽頁的時候把對應(yīng)的組件也銷毀掉就好了。

經(jīng)過網(wǎng)上一翻查找,發(fā)現(xiàn)銷毀一個組件可以使用: this.$destroy(‘組件名') 來銷毀。

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

代碼大概如下:

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 混入到組件對象中,這樣組件中要添加的代碼量就比較少了。

更改后經(jīng)過測試,關(guān)閉標(biāo)簽頁后對應(yīng)的組件就會被銷毀掉,使用 Vue Devtools 能看的很清楚。

更多思考

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

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

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

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

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

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。


分享名稱:vue里主動銷毀keep-alive緩存-創(chuàng)新互聯(lián)
網(wǎng)頁URL:http://www.dlmjj.cn/article/hiigi.html