EP42 - 狀態保持

更新 發佈閱讀 7 分鐘
KeepAlive這是啥?以前好像聽過類似的觀念
繼續看下去吧~內建的組件應該都是很實用的吧!

<KeepAlive> 是一個內建組件,允許我們在動態切換多個組件時有條件地緩存組件實例。

基本用法 - Basic Usage

在組件基礎章節中,我們介紹了動態組件的語法,使用特殊元素 <component>

<template>
<component :is="activeComponent" />
</template>

預設情況下,當切換離開一個活動的組件實例時,它會被卸載,這會導致它所持有的任何狀態更改都會丟失。當再次顯示這個組件時,會創建一個新的實例,只有初始狀態。

在下面的例子中,我們有兩個有狀態的組件——A 包含一個計數器,而 B 包含一個通過 v-model 與輸入同步的消息。嘗試更新其中一個的狀態,切換離開,然後再切換回來:

<template>
<div>
<button @click="activeComponent = 'A'">A</button>
<button @click="activeComponent = 'B'">B</button>
<component :is="activeComponent" />
</div>
</template>

<script>
export default {
data() {
return {
activeComponent: 'A'
}
},
components: {
A: {
template: '<div>Count: {{ count }} <button @click="count++">+</button></div>',
data() {
return { count: 0 }
}
},
B: {
template: '<div>Message: <input v-model="message" /></div>',
data() {
return { message: 'Hello' }
}
}
}
}
</script>

您會注意到當切換回來時,之前更改的狀態已經被重置。

在切換時創建新的組件實例通常是有用的行為,但在這種情況下,我們希望即使這些組件處於非活動狀態時,也能保留它們的實例。為了解決這個問題,我們可以使用內建組件 <KeepAlive> 包裝我們的動態組件:

<template>
<!-- 非活動組件將會被緩存! -->
<KeepAlive>
<component :is="activeComponent" />
</KeepAlive>
</template>

現在,狀態將在組件切換之間保持不變。

Try it in the playground

提示

當在 DOM 模板中使用時,應以 <keep-alive> 的形式引用。

包含/排除 - Include / Exclude​

默認情況下,<KeepAlive> 會緩存其內部的任何組件實例。我們可以通過 include 和 exclude 屬性來自定義這種行為。這兩個屬性都可以是逗號分隔的字符串、正則表達式,或包含任意類型的數組:

<!-- 逗號分隔的字符串 -->
<KeepAlive include="a,b">
<component :is="view" />
</KeepAlive>

<!-- 正則表達式 (使用 `v-bind`) -->
<KeepAlive :include="/a|b/">
<component :is="view" />
</KeepAlive>

<!-- 數組 (使用 `v-bind`) -->
<KeepAlive :include="['a', 'b']">
<component :is="view" />
</KeepAlive>

匹配檢查基於組件的 name 選項,因此需要被 KeepAlive 條件性緩存的組件必須明確聲明 name 選項。

提示

自版本 3.2.34 起,使用 <script setup> 的單文件組件將自動根據文件名推斷其 name 選項,無需手動聲明 name。

最大緩存實例 - Max Cached Instances​

我們可以通過 max 屬性限制可以緩存的組件實例的最大數量。當指定了 max 時,<KeepAlive> 會像 LRU(最近最少使用)緩存一樣運行:如果緩存的實例數量即將超過指定的最大數量,最久未被訪問的緩存實例將被銷毀以騰出空間給新的實例。

<KeepAlive :max="10">
<component :is="activeComponent" />
</KeepAlive>

緩存實例的生命周期 - Lifecycle of Cached Instance

當組件實例從 DOM 中移除但仍是 <KeepAlive> 緩存的組件樹的一部分時,它會進入停用狀態而不是被卸載。當組件實例作為緩存樹的一部分插入 DOM 中時,它會被激活。

被保持活著的組件可以使用 onActivated()onDeactivated() 註冊這兩種狀態的生命周期鉤子:

<script setup>
import { onActivated, onDeactivated } from 'vue'

onActivated(() => {
// 初次掛載時調用
// 並且每次從緩存重新插入時調用
})

onDeactivated(() => {
// 從 DOM 中移除進入緩存時調用
// 以及卸載時調用
})
</script>

注意:

  • onActivated 也會在掛載時調用,onDeactivated 在卸載時調用。
  • 這兩個鉤子不僅對被 <KeepAlive> 緩存的根組件有效,對緩存樹中的後代組件同樣有效。

相關文章

原來前端元件也需要緩衝,
原本以為只要用 hide 和 show 就可以解決。
現在學會了使用 <KeepAlive>,不用重新渲染元素,速度會快不少!
留言
avatar-img
留言分享你的想法!
avatar-img
卡關的人生
4會員
73內容數
分享生活趣事~
卡關的人生的其他內容
2024/11/10
Vue 提供了多種動畫技術來提升應用程式的互動性,包括基於 CSS 類別的動畫、基於狀態的動畫,以及使用監視器來動畫化數值。基於類別的動畫可通過動態添加 CSS 類別來觸發,像是觸發按鈕搖動效果。基於狀態的動畫則是透過樣式綁定,根據互動動態調整元素的外觀,例如根據滑鼠位置改變背景顏色。
Thumbnail
2024/11/10
Vue 提供了多種動畫技術來提升應用程式的互動性,包括基於 CSS 類別的動畫、基於狀態的動畫,以及使用監視器來動畫化數值。基於類別的動畫可通過動態添加 CSS 類別來觸發,像是觸發按鈕搖動效果。基於狀態的動畫則是透過樣式綁定,根據互動動態調整元素的外觀,例如根據滑鼠位置改變背景顏色。
Thumbnail
2024/11/09
Web Components 是一組網頁原生 API,允許開發者創建可重複使用的自訂元素。Vue 與 Web Components 是互補的技術,Vue 支援整合和創建自訂元素。
Thumbnail
2024/11/09
Web Components 是一組網頁原生 API,允許開發者創建可重複使用的自訂元素。Vue 與 Web Components 是互補的技術,Vue 支援整合和創建自訂元素。
Thumbnail
2024/11/08
Vue 建議使用模板構建應用程式,但在需要 JavaScript 的全程式化功能時,渲染函數可派上用場。渲染函數通過 h() 函數創建 vnode,h 是 hyperscript 的簡寫,能生成 HTML 的 JavaScript。
Thumbnail
2024/11/08
Vue 建議使用模板構建應用程式,但在需要 JavaScript 的全程式化功能時,渲染函數可派上用場。渲染函數通過 h() 函數創建 vnode,h 是 hyperscript 的簡寫,能生成 HTML 的 JavaScript。
Thumbnail
看更多
你可能也想看
Thumbnail
你有想過嗎?如果把你過去一週、甚至一整個月的信用卡帳單全部攤開,會變成什麼畫面?😉 格編最近做了一個小實驗:把每一筆消費都丟到地圖上標記,結果它變成一張非常誠實的「生活熱力圖」。把每一筆刷卡都丟到地圖上之後,哪一條路上出現最多「小點點」,就代表你最常走那一條路;哪一個區塊被畫滿圈圈、標記最多店家
Thumbnail
你有想過嗎?如果把你過去一週、甚至一整個月的信用卡帳單全部攤開,會變成什麼畫面?😉 格編最近做了一個小實驗:把每一筆消費都丟到地圖上標記,結果它變成一張非常誠實的「生活熱力圖」。把每一筆刷卡都丟到地圖上之後,哪一條路上出現最多「小點點」,就代表你最常走那一條路;哪一個區塊被畫滿圈圈、標記最多店家
Thumbnail
在網路速度有限的情況下,依序記錄不斷產生的資訊,能統計使用者在頁面上操作了哪些功能。
Thumbnail
在網路速度有限的情況下,依序記錄不斷產生的資訊,能統計使用者在頁面上操作了哪些功能。
Thumbnail
※ 靜態資源回傳 ※ 什麼是靜態資源: 定義:是指事先準備好的資源,這些資源在伺服器上是靜態的、不會隨著每個請求而改變。 資源通常包括: 靜態 HTML 文件。 CSS。 圖像(Image)。 Video。 字體文件:google fonts。 favicon:網頁名稱旁邊的ico
Thumbnail
※ 靜態資源回傳 ※ 什麼是靜態資源: 定義:是指事先準備好的資源,這些資源在伺服器上是靜態的、不會隨著每個請求而改變。 資源通常包括: 靜態 HTML 文件。 CSS。 圖像(Image)。 Video。 字體文件:google fonts。 favicon:網頁名稱旁邊的ico
Thumbnail
在 TypeScript 中,套件是模組化代碼的集合,可以提高代碼的可重用性和可維護性。常見的套件包括各種庫和框架,如 lodash、express 等。以下是有關引用套件、自定義套件和常見套件的詳細介紹。
Thumbnail
在 TypeScript 中,套件是模組化代碼的集合,可以提高代碼的可重用性和可維護性。常見的套件包括各種庫和框架,如 lodash、express 等。以下是有關引用套件、自定義套件和常見套件的詳細介紹。
Thumbnail
建立自己的Module有哪些好處?
Thumbnail
建立自己的Module有哪些好處?
Thumbnail
工具功能 (1) 彈性任意查詢檔案,如對來源目錄設定,檔案修改日期 設定,檔名特定字串或副檔名設定後,自動查出明細,並可展開至各階子目錄處理     (2) 依查詢後結果,可產出 LIST ,提供查詢結果之確認,再依此對檔案作複 (3) 可對檔案作移動,複製至別處,刪除處理,使電腦可騰出硬碟空間
Thumbnail
工具功能 (1) 彈性任意查詢檔案,如對來源目錄設定,檔案修改日期 設定,檔名特定字串或副檔名設定後,自動查出明細,並可展開至各階子目錄處理     (2) 依查詢後結果,可產出 LIST ,提供查詢結果之確認,再依此對檔案作複 (3) 可對檔案作移動,複製至別處,刪除處理,使電腦可騰出硬碟空間
Thumbnail
因為最近想嘗試編碼風格,於是就選了一套比較"不嚴格"的輔助工具來摸索。 編輯器 VS CODE 框架 VUE3 打包工具 VITE 編碼風格 Standard 環境 version { "nodejs":"v18.18.0", "npm":"9.8.1" }
Thumbnail
因為最近想嘗試編碼風格,於是就選了一套比較"不嚴格"的輔助工具來摸索。 編輯器 VS CODE 框架 VUE3 打包工具 VITE 編碼風格 Standard 環境 version { "nodejs":"v18.18.0", "npm":"9.8.1" }
Thumbnail
到存放虛擬機的磁碟處\點選想要註冊的機器\註冊機器(登錄虛擬機器)
Thumbnail
到存放虛擬機的磁碟處\點選想要註冊的機器\註冊機器(登錄虛擬機器)
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News