上篇部落格說到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...