1. <ul id="0c1fb"></ul>

      <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
      <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区

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

      新聞中心

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

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

      創(chuàng)新互聯(lián)建站主要從事成都網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì)、網(wǎng)頁設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)陽江,10年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):028-86922220

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

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

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

      依賴環(huán)境

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

      定位問題

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

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

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

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

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

      解決問題

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

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

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

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

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

      更多思考

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

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

      keep-alive 本質(zhì)上是把整個(gè) dom 節(jié)點(diǎn)及對(duì)應(yīng)的事件等都緩存下來了,當(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 來緩存組件中的數(shù)據(jù),當(dāng)需要重新顯示數(shù)據(jù)時(shí)再把數(shù)據(jù)取出來并重新渲染。當(dāng)然,這是一個(gè)比較大的工程!

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


      本文題目:vue里主動(dòng)銷毀keep-alive緩存
      文章起源:http://www.ef60e0e.cn/article/gpjodo.html
      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区
      1. <ul id="0c1fb"></ul>

        <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
        <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

        肃北| 海阳市| 临夏市| 永年县| 云浮市| 茶陵县| 柯坪县| 邳州市| 青阳县| 资源县| 海伦市| 修水县| 河间市| 吴旗县| 峡江县| 娱乐| 柏乡县| 大宁县| 将乐县| 陇西县| 同德县| 崇左市| 霍邱县| 芮城县| 库车县| 涪陵区| 蒙城县| 平武县| 龙山县| 旬阳县| 林甸县| 华亭县| 乌拉特中旗| 汉川市| 六盘水市| 东丽区| 延长县| 许昌市| 荣成市| 吉水县| 揭东县|