Vue優化2 常見會導致記憶體洩漏問題及優化

2021-10-06 13:22:10 字數 1097 閱讀 5432

上篇部落格說到vue自定義指令給元素繫結事件,事件沒有解綁會造成記憶體洩漏,下面還有一種情況:

v-if指令產生的記憶體洩露

v-if也是乙個容易產生記憶體洩漏的地方。因為:

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

2、就是非常常見的比如我們通過v-if刪除了父級元素,但是並沒有移除父級元素裡的dom片段。通常產生於使用第三方庫的時候,比如下面的示例中,我們載入了乙個帶有非常多選項的選擇框,然後我們用到了乙個顯示/隱藏按鈕,通過乙個 v-if 指令從虛擬 dom 中新增或移除它。這個示例的問題在於這個 v-if 指令會從 dom 中移除父級元素,但是我們並沒有清除由 choices.js 新新增的 dom 片段,從而導致了記憶體洩漏。舉個例子:

show

new vue(

},mounted: function () ,

methods: )

}new choices("#choices-single-default", )

},show: function () )

},hide: function ()

}})

解決例項:在上述的示例中,我們可以用 hide() 方法在將選擇框從 dom 中移除之前做一些清理工作,來解決記憶體洩露問題。為了做到這一點,我們會在 vue 例項的資料物件中保留乙個屬性,並會使用 choices api 中的 destroy() 方法將其清除。不了解的小夥伴可以了解一下choices api 中的 destroy() 方法

new vue(

},mounted: function () ,

methods: )

}// 在我們的 vue 例項的資料物件中設定乙個 `choicesselect` 的引用

this.choicesselect = new choices("#choices-single-default", )

},show: function () )

},hide: function ()

}})

這樣就解決了!

為什麼迴圈引用會導致「記憶體洩漏」

首先這個問題對於現代瀏覽器 ie9 來說已經不是問題了,這個問題其實是出現在ie8的時代了 我們主要是通過這個問題來介紹下瀏覽器的垃圾 機制 js是有自己的一套自動垃圾 機制的,這是大部分高階語言都具備的 除了c語言 然而它的機制是什麼呢?採用過的有2種 標記清除 和 引用計數 先明確一點現代瀏覽器...

vue中v html會導致哪些問題

可能會導致xss攻擊 v html更新的是元素的 innerhtml 內容按普通 html 插入,不會作為 vue 模板進行編譯 但是有的時候我們需要渲染的html片段中有插值表示式,或者按照vue模板語法給dom元素繫結了事件。在單檔案元件裡,scoped 的樣式不會應用在 v html 內部,因...

vue自定義指令導致的記憶體洩漏問題解決

vue的自定義指令是乙個比較容易引起記憶體洩漏的地方,原因就在於指令通常給元素繫結了事件,但是如果忘記了解綁,就會產生記憶體洩漏的問題。看下面 directives target target.parentnode return window let targetnode getscrolleven...