亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

vue 里主動(dòng)銷毀 keep-alive 緩存的組件

antz / 3334人閱讀

摘要:經(jīng)過(guò)網(wǎng)上一翻查找,發(fā)現(xiàn)銷毀一個(gè)組件可以使用組件名來(lái)銷毀。本質(zhì)上是把整個(gè)節(jié)點(diǎn)及對(duì)應(yīng)的事件等都緩存下來(lái)了,當(dāng)這樣的組件很多的時(shí)候,自然會(huì)占用很多內(nèi)存。

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

我們一個(gè)后臺(tái),在切換一些標(biāo)簽頁(yè)的時(shí)候,是使用的 keep-alive 緩存的標(biāo)簽頁(yè),也使用了 include 屬性來(lái)決定哪個(gè)頁(yè)面進(jìn)行緩存,而標(biāo)簽頁(yè)的切換實(shí)際上是路由的切換,也就是說(shuō)打開一個(gè)新標(biāo)簽頁(yè)的時(shí)候,url 會(huì)跟著變化,老的標(biāo)簽頁(yè)如果在 keep-aliveinclude 范圍內(nèi)那就會(huì)緩存下來(lái)。
然后客服人員就反饋?lái)?yè)面開的久了就會(huì)崩潰,因?yàn)樗麄兓A(chǔ)上不會(huì)刷新頁(yè)面(工作需要),又總有切換標(biāo)簽的習(xí)慣,最后導(dǎo)致內(nèi)存越來(lái)越大最后崩潰。

依賴環(huán)境

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

定位問(wèn)題

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

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

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

解決問(wèn)題

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

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

先說(shuō)下大概思路:keep-aliveinclude 里存的其實(shí)是一個(gè) vuex 中的一個(gè)數(shù)據(jù)源(數(shù)據(jù)源保存的是路由名稱),當(dāng)關(guān)閉標(biāo)簽頁(yè)時(shí),這個(gè)數(shù)據(jù)源中的一項(xiàng)會(huì)被移除。這之前,我們?cè)诮M件里監(jiān)聽到這個(gè)數(shù)據(jù)源的變化,如果此組件對(duì)應(yīng)的路由(這個(gè)路由應(yīng)在 mounted 的時(shí)候保存下來(lái))已經(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 這一項(xiàng))
        this.$destroy(this.$options.name)
      }
    }
  }
}

export default mixin

這一段代碼多帶帶拎出來(lái)了,然后在需要緩存的組件里使用 mixins 混入到組件對(duì)象中,這樣組件中要添加的代碼量就比較少了。

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

更多思考

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

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

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

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

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/102739.html

相關(guān)文章

  • vue中keepAlive使用

    摘要:文檔在及其更高版本中,和將會(huì)在樹內(nèi)的所有嵌套組件中觸發(fā)。另外,在我們的項(xiàng)目中遇到路由相同但參數(shù)不同的情況組件被復(fù)用,不更新的問(wèn)題,官方給出了響應(yīng)路由參數(shù)變化根據(jù)參數(shù)數(shù)據(jù)響應(yīng) 前言 在開發(fā)中經(jīng)常有從列表跳到詳情頁(yè),然后返回詳情頁(yè)的時(shí)候需要緩存列表頁(yè)的狀態(tài)(比如滾動(dòng)位置信息),這個(gè)時(shí)候就需要保存狀態(tài),要緩存狀態(tài);vue里提供了keep-alive組件用來(lái)緩存狀態(tài)??梢杂靡韵聨追N方案解決問(wèn)題...

    Anleb 評(píng)論0 收藏0
  • 個(gè)人 vue 項(xiàng)目優(yōu)化總結(jié)

    摘要:很多優(yōu)化點(diǎn)都是根據(jù)實(shí)際情況入手,上面這幾個(gè),都是我在做項(xiàng)目時(shí),感覺不合適而進(jìn)行優(yōu)化的,后面會(huì)持續(xù)補(bǔ)充下去 主要說(shuō)的是,我在項(xiàng)目中,自己遇到的一些小問(wèn)題和解決方案 圖片 base64 問(wèn)題 // 有一個(gè) test 的組件 .icon { background: url(../assets/test.png); } // 然后有三個(gè)頁(yè)面,引入了 test 組...

    taoszu 評(píng)論0 收藏0
  • vue keep-alive組件使用以及原理。

    摘要:通過(guò)這兩種方式分別檢測(cè)是否匹配當(dāng)前組件。修正取出中的不符合條件的,同時(shí)不是目前渲染的時(shí),銷毀對(duì)應(yīng)的組件實(shí)例實(shí)例,并從中移除銷毀對(duì)應(yīng)的組件實(shí)例實(shí)例遍歷中的所有項(xiàng),如果不符合指定的規(guī)則的話,則會(huì)執(zhí)行。則會(huì)調(diào)用組件實(shí)例的方法來(lái)將組件銷毀。 keep-alive keep-alive是vue.js的內(nèi)置組件,它能夠把不活動(dòng)的組件的實(shí)例保存在內(nèi)存中,而不是直接的銷毀,它是一個(gè)抽象組件,不會(huì)被渲染...

    pingan8787 評(píng)論0 收藏0
  • 聊聊keep-alive組件使用及其實(shí)現(xiàn)原理

    摘要:為的組件將不會(huì)被緩存。通過(guò)這兩種方式分別檢測(cè)是否匹配當(dāng)前組件。修正取出中的不符合條件的,同時(shí)不是目前渲染的時(shí),銷毀對(duì)應(yīng)的組件實(shí)例實(shí)例,并從中移除銷毀對(duì)應(yīng)的組件實(shí)例實(shí)例遍歷中的所有項(xiàng),如果不符合指定的規(guī)則的話,則會(huì)執(zhí)行。 寫在前面 因?yàn)閷?duì)Vue.js很感興趣,而且平時(shí)工作的技術(shù)棧也是Vue.js,這幾個(gè)月花了些時(shí)間研究學(xué)習(xí)了一下Vue.js源碼,并做了總結(jié)與輸出。 文章的原地址:http...

    frolc 評(píng)論0 收藏0
  • vue keep-alive實(shí)現(xiàn)動(dòng)態(tài)緩存以及緩存銷毀

    摘要:實(shí)現(xiàn)動(dòng)態(tài)緩存以及緩存銷毀需求來(lái)源及描述后臺(tái)管理系統(tǒng)中,左側(cè)為功能菜單欄,點(diǎn)擊菜單列表,右側(cè)顯示該菜單的功能頁(yè)面,本來(lái)是一個(gè)非常簡(jiǎn)單的后臺(tái)管理系統(tǒng)布局,現(xiàn)在增加了菜單按鈕點(diǎn)擊左側(cè)菜單欄時(shí),右側(cè)頁(yè)面頭部顯示當(dāng)前的頁(yè)面標(biāo)題,形成一個(gè)列表,點(diǎn)擊可 vue keep-alive實(shí)現(xiàn)動(dòng)態(tài)緩存以及緩存銷毀 需求來(lái)源及描述 后臺(tái)管理系統(tǒng)中,左側(cè)為功能菜單欄,點(diǎn)擊菜單列表,右側(cè)顯示該菜單的功能頁(yè)面,本來(lái)...

    littleGrow 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<