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
卡關的人生
2會員
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
家中修繕或裝潢想要找各種小零件時,直接上網採買可以省去不少煩惱~看看Sylvia這回為了工地買了些什麼吧~
Thumbnail
家中修繕或裝潢想要找各種小零件時,直接上網採買可以省去不少煩惱~看看Sylvia這回為了工地買了些什麼吧~
Thumbnail
👜簡單生活,從整理包包開始!我的三款愛用包+隨身小物清單開箱,一起來看看我每天都帶些什麼吧🌿✨
Thumbnail
👜簡單生活,從整理包包開始!我的三款愛用包+隨身小物清單開箱,一起來看看我每天都帶些什麼吧🌿✨
Thumbnail
創作者營運專員/經理(Operations Specialist/Manager)將負責對平台成長及收入至關重要的 Partnership 夥伴創作者開發及營運。你將發揮對知識與內容變現、影響力變現的精準判斷力,找到你心中的潛力新星或有聲量的中大型創作者加入 vocus。
Thumbnail
創作者營運專員/經理(Operations Specialist/Manager)將負責對平台成長及收入至關重要的 Partnership 夥伴創作者開發及營運。你將發揮對知識與內容變現、影響力變現的精準判斷力,找到你心中的潛力新星或有聲量的中大型創作者加入 vocus。
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) 可對檔案作移動,複製至別處,刪除處理,使電腦可騰出硬碟空間
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News