最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2019年03月21日 10:13:19   作者:old_bin  
這篇文章主要介紹了vue里如何主動(dòng)銷毀keep-alive緩存的組件,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

問(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ō)打開(kāi)一個(gè)新標(biāo)簽頁(yè)的時(shí)候,url 會(huì)跟著變化,老的標(biāo)簽頁(yè)如果在 keep-aliveinclude 范圍內(nèi)那就會(huì)緩存下來(lái)。

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

依賴環(huán)境

這個(gè)項(xiàng)目是基于一個(gè)開(kāi)源 vue 后臺(tái)框架:https://github.com/PanJiaChen/vue-element-admin,然后代碼一直由幾個(gè)后端開(kāi)發(fā)維護(hù)的!所以后端沒(méi)找出問(wèn)題在哪,然后就我來(lái)接手這個(gè)問(wèn)題了。
寫(xiě)文章時(shí),標(biāo)簽里竟然沒(méi)有 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è)面沒(méi)在 keep-aliveinclude 里了,但是組件也沒(méi)有被銷毀掉,還是在緩存狀態(tài),我們可以通過(guò) Vue Devtools 插件看到關(guān)閉后的標(biāo)簽頁(yè)對(duì)應(yīng)的組件一直還存在著:

當(dāng)然,在這塊 keep-alive 本身的邏輯我覺(jué)得是沒(méi)問(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)聽(tīng)到這個(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 里沒(méi)有了 routePath 這一項(xiàng))
    this.$destroy(this.$options.name)
   }
  }
 }
}

export default mixin

這一段代碼單獨(dú)拎出來(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)建/打開(kāi)新的標(biāo)簽頁(yè)時(shí),內(nèi)存還是會(huì)在短時(shí)間內(nèi)高漲。而且有時(shí)候,內(nèi)存在經(jīng)過(guò)一段時(shí)間后也并沒(méi)有回收掉。

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è)比較大的工程!

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • vue2如何獲取上頁(yè)的url地址

    vue2如何獲取上頁(yè)的url地址

    這篇文章主要介紹了vue2如何獲取上頁(yè)的url地址問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • 使用vue打包時(shí)gzip壓縮的兩種方案

    使用vue打包時(shí)gzip壓縮的兩種方案

    這篇文章主要介紹了使用vue打包時(shí)gzip壓縮的兩種方案小結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • Vue.js?的過(guò)濾器你了解多少

    Vue.js?的過(guò)濾器你了解多少

    這篇文章主要為大家詳細(xì)介紹了Vue.js?的過(guò)濾器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-02-02
  • vue手機(jī)端input change時(shí),無(wú)法執(zhí)行的問(wèn)題及解決

    vue手機(jī)端input change時(shí),無(wú)法執(zhí)行的問(wèn)題及解決

    這篇文章主要介紹了vue手機(jī)端input change時(shí),無(wú)法執(zhí)行的問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • 詳細(xì)聊聊Vue中的MVVM模式原理

    詳細(xì)聊聊Vue中的MVVM模式原理

    MVVM旨在利用WPF中的數(shù)據(jù)綁定函數(shù),通過(guò)從視圖層中幾乎刪除所有GUI代碼(代碼隱藏),更好地促進(jìn)視圖層開(kāi)發(fā)與模式其余部分的分離,這篇文章主要給大家介紹了關(guān)于Vue.js中MVVM的相關(guān)資料,需要的朋友可以參考下
    2023-03-03
  • Vue實(shí)現(xiàn)百度下拉提示搜索功能

    Vue實(shí)現(xiàn)百度下拉提示搜索功能

    這篇文章主要為大家詳細(xì)介紹了Vue實(shí)現(xiàn)百度下拉提示搜索功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • 在Vue中實(shí)現(xiàn)隨hash改變響應(yīng)菜單高亮

    在Vue中實(shí)現(xiàn)隨hash改變響應(yīng)菜單高亮

    這篇文章主要介紹了在Vue中實(shí)現(xiàn)隨hash改變響應(yīng)菜單高亮的方法,文中還通過(guò)實(shí)例代碼給大家介紹了vue關(guān)于點(diǎn)擊菜單高亮與組件切換的相關(guān)知識(shí),需要的朋友可以參考下
    2020-03-03
  • vue+vant使用圖片預(yù)覽功能ImagePreview的問(wèn)題解決

    vue+vant使用圖片預(yù)覽功能ImagePreview的問(wèn)題解決

    這篇文章主要介紹了vue+vant使用圖片預(yù)覽功能ImagePreview的問(wèn)題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • vscode配置vue下的es6規(guī)范自動(dòng)格式化詳解

    vscode配置vue下的es6規(guī)范自動(dòng)格式化詳解

    這篇文章主要介紹了vscode配置vue下的es6規(guī)范自動(dòng)格式化詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-03-03
  • Vue實(shí)現(xiàn)模糊查詢filter()實(shí)例詳解

    Vue實(shí)現(xiàn)模糊查詢filter()實(shí)例詳解

    因?yàn)榻赵趯W(xué)習(xí)并使用VUE,客戶有一個(gè)要求,要輸入框可模糊查詢并帶有下拉提示的應(yīng)用,數(shù)據(jù)從接口取,下面這篇文章主要給大家介紹了關(guān)于Vue實(shí)現(xiàn)模糊查詢filter()的相關(guān)資料,需要的朋友可以參考下
    2023-04-04

最新評(píng)論

克山县| 图木舒克市| 富锦市| 天门市| 商南县| 安远县| 姚安县| 勃利县| 嘉祥县| 平湖市| 大港区| 将乐县| 保康县| 遂溪县| 密云县| 永济市| 永兴县| 玉山县| 元阳县| 时尚| 迁安市| 宽甸| 塔城市| 台南县| 巨野县| 酉阳| 禹州市| 原平市| 昌江| 绵阳市| 双峰县| 甘德县| 米泉市| 金华市| 微山县| 鄄城县| 济宁市| 遵化市| 镇安县| 茂名市| 武胜县|