亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

 更新時(shí)間:2020年08月04日 14:23:33   作者:古蘭精  
這篇文章主要介紹了Vue優(yōu)化:常見(jiàn)會(huì)導(dǎo)致內(nèi)存泄漏問(wèn)題及優(yōu)化詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧

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

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

一、vue自定義指令給元素綁定事件,卻沒(méi)有解綁事件

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

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

v-if也是一個(gè)容易產(chǎn)生內(nèi)存泄漏的地方。因?yàn)椋?/p>

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

2、就是非常常見(jiàn)的比如我們通過(guò)v-if刪除了父級(jí)元素,但是并沒(méi)有移除父級(jí)元素里的dom片段。通常產(chǎn)生于使用第三方庫(kù)的時(shí)候,比如下面的示例中,我們加載了一個(gè)帶有非常多選項(xiàng)的選擇框,然后我們用到了一個(gè)顯示/隱藏按鈕,通過(guò)一個(gè) v-if 指令從虛擬 DOM 中添加或移除它。這個(gè)示例的問(wèn)題在于這個(gè) v-if 指令會(huì)從 DOM 中移除父級(jí)元素,但是我們并沒(méi)有清除由 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 = []
  // 我們來(lái)為選擇框載入很多選項(xiàng)
  // 這樣的話它會(huì)占用大量的內(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
 }
 }
})

解決實(shí)例:在上述的示例中,我們可以用 hide() 方法在將選擇框從 DOM 中移除之前做一些清理工作,來(lái)解決內(nèi)存泄露問(wèn)題。為了做到這一點(diǎn),我們會(huì)在 Vue 實(shí)例的數(shù)據(jù)對(duì)象中保留一個(gè)屬性,并會(huì)使用 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í)例的數(shù)據(jù)對(duì)象中設(shè)置一個(gè) `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 使用這個(gè)引用
  // 在從 DOM 中移除這些元素之前進(jìn)行清理工作
  this.choicesSelect.destroy()
  this.showChoices = false
 }
 }
})

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

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

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

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

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

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

還有一個(gè)替代方案:

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

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

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

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

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

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

以上這篇Vue優(yōu)化:常見(jiàn)會(huì)導(dǎo)致內(nèi)存泄漏問(wèn)題及優(yōu)化詳解就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • vue如何通過(guò)id從列表頁(yè)跳轉(zhuǎn)到對(duì)應(yīng)的詳情頁(yè)

    vue如何通過(guò)id從列表頁(yè)跳轉(zhuǎn)到對(duì)應(yīng)的詳情頁(yè)

    這篇文章主要介紹了vue如何通過(guò)id從列表頁(yè)跳轉(zhuǎn)到對(duì)應(yīng)的詳情頁(yè) ,需要的朋友可以參考下
    2018-05-05
  • element表格行列拖拽的實(shí)現(xiàn)示例

    element表格行列拖拽的實(shí)現(xiàn)示例

    本文主要介紹了element表格行列拖拽的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • vue彈窗消息組件的使用方法

    vue彈窗消息組件的使用方法

    這篇文章主要為大家詳細(xì)介紹了vue彈窗消息組件的使用方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-04-04
  • vue3數(shù)據(jù)更新而視圖未更新問(wèn)題解決

    vue3數(shù)據(jù)更新而視圖未更新問(wèn)題解決

    本文主要介紹了vue3?解決數(shù)據(jù)更新而視圖未更新問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-10-10
  • vue3中給數(shù)組賦值丟失響應(yīng)式的解決

    vue3中給數(shù)組賦值丟失響應(yīng)式的解決

    這篇文章主要介紹了vue3中給數(shù)組賦值丟失響應(yīng)式的解決方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • vue-cli3 打包優(yōu)化之 splitchunks詳解

    vue-cli3 打包優(yōu)化之 splitchunks詳解

    這篇文章主要介紹了vue-cli3 打包優(yōu)化之 splitchunks的相關(guān)知識(shí),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-07-07
  • vue中computed順序、watch順序、響應(yīng)次數(shù)使用

    vue中computed順序、watch順序、響應(yīng)次數(shù)使用

    這篇文章主要介紹了vue中computed順序、watch順序、響應(yīng)次數(shù)使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • 前端實(shí)現(xiàn)不同角色登入展示不同頁(yè)面效果實(shí)例

    前端實(shí)現(xiàn)不同角色登入展示不同頁(yè)面效果實(shí)例

    要實(shí)現(xiàn)不同角色登錄跳轉(zhuǎn)不同的前端頁(yè)面,可以在登錄成功后,根據(jù)用戶的角色信息,使用路由跳轉(zhuǎn)到不同的頁(yè)面,這篇文章主要給大家介紹了關(guān)于前端實(shí)現(xiàn)不同角色登入展示不同頁(yè)面效果的相關(guān)資料,需要的朋友可以參考下
    2024-08-08
  • Vue編譯器AST抽象語(yǔ)法樹(shù)源碼分析

    Vue編譯器AST抽象語(yǔ)法樹(shù)源碼分析

    這篇文章主要為大家介紹了Vue編譯器AST抽象語(yǔ)法樹(shù)源碼分析詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • Vue3?計(jì)算屬性的用法詳解

    Vue3?計(jì)算屬性的用法詳解

    學(xué)過(guò)?vue2?的寶子們應(yīng)該都清楚,計(jì)算屬性這個(gè)東西在項(xiàng)目開(kāi)發(fā)過(guò)程中使用的還是比較頻繁的,使用頻率相對(duì)來(lái)說(shuō)比較高。本文就來(lái)為大家介紹一下Vue3中計(jì)算屬性的用法,需要的可以參考一下
    2022-07-07

最新評(píng)論