日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

Vue優(yōu)化:常見會導(dǎo)致內(nèi)存泄漏問題及優(yōu)化詳解

瀏覽:221日期:2022-12-17 14:39:38

如果你在用 Vue 開發(fā)應(yīng)用,那么就要當心內(nèi)存泄漏的問題。這個問題在單頁應(yīng)用 (SPA) 中尤為重要,因為在 SPA 的設(shè)計中,用戶使用它時是不需要刷新瀏覽器的,所以 JavaScript 應(yīng)用需要自行清理組件來確保垃圾回收以預(yù)期的方式生效。因此在vue開發(fā)過程中,你需要時刻警惕內(nèi)存泄漏的問題,這些內(nèi)存泄漏往往會發(fā)生在使用 Vue 之外的其它進行 DOM 操作的三方庫時,請確保測試應(yīng)用的內(nèi)存泄漏問題并在適當?shù)臅r機做必要的組件清理。

下面是我開發(fā)過程中遇到,并查資料總結(jié)的內(nèi)存泄漏問題,會持續(xù)更新中

一、vue自定義指令給元素綁定事件,卻沒有解綁事件

這個問題見上篇博客,vue自定義指令導(dǎo)致的內(nèi)存泄漏問題解決

二、v-if指令產(chǎn)生的內(nèi)存泄露

v-if也是一個容易產(chǎn)生內(nèi)存泄漏的地方。因為:

1、v-if綁定到false的值,但是實際上dom元素在隱藏的時候沒有被真實的釋放掉

2、就是非常常見的比如我們通過v-if刪除了父級元素,但是并沒有移除父級元素里的dom片段。通常產(chǎn)生于使用第三方庫的時候,比如下面的示例中,我們加載了一個帶有非常多選項的選擇框,然后我們用到了一個顯示/隱藏按鈕,通過一個 v-if 指令從虛擬 DOM 中添加或移除它。這個示例的問題在于這個 v-if 指令會從 DOM 中移除父級元素,但是我們并沒有清除由 Choices.js 新添加的 DOM 片段,從而導(dǎo)致了內(nèi)存泄漏。

<link rel='stylesheet prefetch' rel='external nofollow' ><script src='https://joshuajohnson.co.uk/Choices/assets/scripts/dist/choices.min.js?version=3.0.3'></script><div id='app'> <button v-if='showChoices' @click='hide'>Hide</button> <button v-if='!showChoices' @click='show' >Show</button> <div v-if='showChoices'> <select id='choices-single-default'></select> </div></div>

new Vue({ el: '#app', data: function () { return { showChoices: true } }, mounted: function () { this.initializeChoices() }, methods: { initializeChoices: function () { let list = [] // 我們來為選擇框載入很多選項 // 這樣的話它會占用大量的內(nèi)存 for (let i = 0; i < 1000; i++) { list.push({ label: 'Item ' + i, value: i }) } new Choices('#choices-single-default', { searchEnabled: true, removeItemButton: true, choices: list }) }, show: function () { this.showChoices = true this.$nextTick(() => { this.initializeChoices() }) }, hide: function () { this.showChoices = false } }})

解決實例:在上述的示例中,我們可以用 hide() 方法在將選擇框從 DOM 中移除之前做一些清理工作,來解決內(nèi)存泄露問題。為了做到這一點,我們會在 Vue 實例的數(shù)據(jù)對象中保留一個屬性,并會使用 Choices API 中的 destroy() 方法將其清除。

new Vue({ el: '#app', data: function () { return { showChoices: true, choicesSelect: null } }, mounted: function () { this.initializeChoices() }, methods: { initializeChoices: function () { let list = [] for (let i = 0; i < 1000; i++) { list.push({ label: 'Item ' + i, value: i }) } // 在我們的 Vue 實例的數(shù)據(jù)對象中設(shè)置一個 `choicesSelect` 的引用 this.choicesSelect = new Choices('#choices-single-default', { searchEnabled: true, removeItemButton: true, choices: list }) }, show: function () { this.showChoices = true this.$nextTick(() => { this.initializeChoices() }) }, hide: function () { // 現(xiàn)在我們可以讓 Choices 使用這個引用 // 在從 DOM 中移除這些元素之前進行清理工作 this.choicesSelect.destroy() this.showChoices = false } }})

三、vue-router跳轉(zhuǎn)到別的組件導(dǎo)致的內(nèi)容泄漏

在上述示例中,我們使用了一個 v-if 指令產(chǎn)生內(nèi)存泄漏,但是一個更常見的實際的場景是使用 Vue Router 在一個單頁應(yīng)用中路由到不同的組件。

就像這個 v-if 指令一樣,當一個用戶在你的應(yīng)用中導(dǎo)航時,Vue Router 從虛擬 DOM 中移除了元素,并替換為了新的元素。但是其子元素dom片段也并沒有銷毀。

Vue 的 beforeDestroy() 生命周期鉤子是一個解決基于 Vue Router 的應(yīng)用中的這類問題的好方法。我們可以將清理工作放入 beforeDestroy() 鉤子,像這樣:

beforeDestroy: function () { this.choicesSelect.destroy()}

所以最正確的解決方案就是:首先,v-if置為false前先刪除創(chuàng)建的dom片段;其次,路由跳出吃,在beforeDestroy鉤子函數(shù)里面判斷choicesSelect是否銷毀,沒銷毀則銷毀。

還有一個替代方案:

我們已經(jīng)討論了移除元素時的內(nèi)存管理,但是如果你打算在內(nèi)存中保留狀態(tài)和元素該怎么做呢?這種情況下,你可以使用內(nèi)建的 keep-alive 組件。

當你用 keep-alive 包裹一個組件后,它的狀態(tài)就會保留,因此就留在了內(nèi)存里。

<button @click='show = false'>Hide</button><keep-alive> // <my-component> 即便被刪除仍會刻意保留在內(nèi)存里 <my-component v-if='show'></my-component></keep-alive>

這個技巧可以用來提升用戶體驗。例如,設(shè)想一個用戶在一個文本框中輸入了評論,之后決定導(dǎo)航離開。如果這個用戶之后導(dǎo)航回來,那些評論應(yīng)該還保留著。

一旦你使用了 keep-alive,那么你就可以訪問另外兩個生命周期鉤子:activated和 deactivated。如果你想要在一個 keep-alive 組件被移除的時候進行清理或改變數(shù)據(jù),可以使用 deactivated 鉤子。

deactivated: function () { // 移除任何你不想保留的數(shù)據(jù),或者銷毀可能產(chǎn)生內(nèi)存泄漏的地方}

以上這篇Vue優(yōu)化:常見會導(dǎo)致內(nèi)存泄漏問題及優(yōu)化詳解就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持好吧啦網(wǎng)。

標簽: Vue
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国精品一区二区| 黑丝一区二区三区| 免费不卡在线视频| 亚洲欧美激情诱惑| 一本一本久久| 日韩中文在线播放| 国产不卡精品| 麻豆国产一区| 欧美黄色一区二区| 国产精品成人**免费视频| 亚洲毛片网站| 先锋影音久久久| 亚洲一区二区三区四区五区午夜| 久久狠狠婷婷| 欧美二区视频| 亚洲激情av| 首页欧美精品中文字幕| aa国产精品| 久久最新视频| 亚洲精品乱码日韩| 天海翼亚洲一区二区三区| 亚洲日本国产| 国产精品久久久久77777丨| 国产欧美大片| 老牛国内精品亚洲成av人片| 久久精品国内一区二区三区| 国产+成+人+亚洲欧洲在线| 国产福利片在线观看| 樱桃视频成人在线观看| 日产精品一区| 国产精品腿扒开做爽爽爽挤奶网站| 手机精品视频在线观看| 免费久久99精品国产自在现线| 亚洲久久一区| 欧美黄色一区二区| 久久久久久久久成人| www.51av欧美视频| 91精品国产成人观看| 中文精品视频| 日本中文字幕视频一区| 免费在线观看一区| 99精品一区| 在线一区二区三区视频| 国产午夜精品一区在线观看| 狠狠久久伊人中文字幕| 亚洲高清二区| 亚欧成人精品| 国产一区二区三区久久久久久久久| 视频福利一区| 日韩中文字幕| 麻豆久久一区| 亚洲视频综合| 日韩视频1区| 色一区二区三区| 美女国产精品| 国产精品亚洲综合久久| 日韩久久精品| 亚洲婷婷丁香| 91亚洲一区| 蜜桃视频一区二区三区| 国产极品模特精品一二| 美女网站一区| 国产精品一区二区精品| 亚洲午夜在线| 国产欧美日韩在线一区二区| 国产成人免费av一区二区午夜| 欧美在线网站| 久久一区视频| 老司机久久99久久精品播放免费| 国产日韩三级| 欧美精品一区二区久久| 国产精品自拍区| 在线精品视频在线观看高清| 国产精品久久久久久av公交车| 黑丝一区二区| 国产成人精品999在线观看| 六月婷婷一区| sm捆绑调教国产免费网站在线观看| 综合激情婷婷| 秋霞影视一区二区三区| 日韩精品一区二区三区中文| 日韩精品欧美激情一区二区| 欧美亚洲综合视频| 午夜电影亚洲| 超碰99在线| 国产美女久久| 老司机久久99久久精品播放免费| 91亚洲国产成人久久精品| 亚洲精品在线国产| 欧美成人综合| 精品国产免费人成网站| 日韩高清不卡在线| 91久久黄色| 老牛影视精品| 国产精品亚洲欧美一级在线| 亚洲女同一区| 丝袜美腿诱惑一区二区三区| 久久激五月天综合精品| 国产亚洲福利| 久久久精品五月天| 久久精品毛片| 国产精品久久久亚洲一区| 国产精品三上| av一区二区高清| 日韩免费av| 国产一区二区三区四区大秀| 国产精品大片免费观看| 国产亚洲高清在线观看| 日本不卡一区二区| 亚洲三级毛片| 中文一区一区三区免费在线观 | 日韩一级精品| 亚洲午夜电影| 亚洲免费福利| 国产成人精品一区二区三区在线| 91精品福利观看| 中文一区一区三区免费在线观 | 国内精品麻豆美女在线播放视频| 欧美天堂在线| 羞羞答答国产精品www一本| 91免费精品| 麻豆国产精品一区二区三区| 91成人福利| 日韩免费精品| 美国三级日本三级久久99| 99久久久久国产精品| 精品丝袜久久| 国产精品夜夜夜| 日本视频一区二区| 日韩中文字幕不卡| 黄色成人91| 99久久亚洲精品蜜臀| 欧美激情国产在线| 精品视频高潮| 国产欧美88| 老色鬼久久亚洲一区二区| 在线视频观看日韩| 午夜精品成人av| 不卡福利视频| 天堂√中文最新版在线| 国产欧美日韩视频在线 | 亚洲色图综合| 性色av一区二区怡红| 亚洲激情国产| 日韩一级欧洲| 亚洲一区中文| 国产精品毛片| 美女精品在线| 香蕉久久夜色精品国产| 亚洲视频www| 久久成人精品| 蜜臀av性久久久久蜜臀aⅴ流畅| 亚洲一区二区三区免费在线观看| 天堂精品久久久久| 日韩有吗在线观看| 奇米色欧美一区二区三区| 日本不卡的三区四区五区| 日韩精品成人在线观看| 婷婷亚洲五月| 久久99伊人| 老司机久久99久久精品播放免费| 三级欧美在线一区| 日韩精品一二三| 免费在线成人网| 老牛影视一区二区三区| 六月婷婷一区| 美日韩一区二区三区| 久久精品国产精品亚洲毛片| 精品72久久久久中文字幕| 丁香六月综合| 欧美性感美女一区二区| 久久婷婷丁香| 日韩成人在线看| 国产精品一区高清| 日韩av在线播放网址| 久久久天天操| 国内亚洲精品| 91成人精品视频| 在线日韩成人| 国产一区精品福利| 久久免费高清| 免费在线看一区| 91福利精品在线观看| 久久久久观看| 99香蕉国产精品偷在线观看| 亚洲精品乱码日韩| 欧美精品中文字幕亚洲专区| 久久不卡日韩美女| 肉色欧美久久久久久久免费看 | 久久久精品区| 日韩一区二区三区免费| 午夜视频精品| 日本在线不卡视频一二三区| 国产欧美另类| 91久久亚洲| 日本久久二区| 精品精品国产三级a∨在线| 久久一区二区中文字幕| 国产精品毛片在线看| 青青伊人久久|