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
2會員
71內容數
分享生活趣事~
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
卡關的人生 的其他內容
<TransitionGroup> 是一個內建組件,專為對列表中的元素或組件進行插入、移除和順序變更的動畫處理而設計。與 <Transition> 的主要區別在於,<TransitionGroup> 預設不會渲染包裹元素,且不支持轉場模式。
<Transition> 用於元素或組件進入和離開 DOM 時的動畫,而 <TransitionGroup> 則應用於 v-for 列表的插入、移除或移動。這些組件透過 CSS 類別來控制動畫,例如進入/離開的狀態類別。可以透過 name 屬性自訂過渡效果的命名。
Vue 插件是自包含的代碼,通過 app.use() 方法安裝,用於擴展應用功能。插件可定義為包含 install() 方法的物件,或簡單的函數。插件用途包括註冊全局組件、自定義指令、資源注入和添加全局屬性。
Vue 自定義指令用於擴充功能,需要直接操作 DOM 時使用。常見例子如 v-focus 指令,使元素在插入 DOM 時自動獲得焦點。指令定義物件可提供多個生命週期鉤子函數,例如 mounted、updated 等。指令可以簡寫為函數,當行為在 mounted 和 updated 時相同時特別方便。
在學習 Vue 的可重用性(Reusability)時,Composables 是重要概念,專指可以重複使用的函式。這些函式利用 Vue 的 Composition API 封裝和重用有狀態的邏輯,幫助開發者在應用程式中進行常見任務的邏輯重用,例如格式化日期或追蹤鼠標位置。
Vue 的 scoped 樣式無法完全隔離全局樣式,需要採取其他策略如 BEM 命名規則或 CSS Modules 來避免衝突。未來可能也會遇到 JavaScript 衝突,因此需遵循嚴格的命名和範圍控制。
<TransitionGroup> 是一個內建組件,專為對列表中的元素或組件進行插入、移除和順序變更的動畫處理而設計。與 <Transition> 的主要區別在於,<TransitionGroup> 預設不會渲染包裹元素,且不支持轉場模式。
<Transition> 用於元素或組件進入和離開 DOM 時的動畫,而 <TransitionGroup> 則應用於 v-for 列表的插入、移除或移動。這些組件透過 CSS 類別來控制動畫,例如進入/離開的狀態類別。可以透過 name 屬性自訂過渡效果的命名。
Vue 插件是自包含的代碼,通過 app.use() 方法安裝,用於擴展應用功能。插件可定義為包含 install() 方法的物件,或簡單的函數。插件用途包括註冊全局組件、自定義指令、資源注入和添加全局屬性。
Vue 自定義指令用於擴充功能,需要直接操作 DOM 時使用。常見例子如 v-focus 指令,使元素在插入 DOM 時自動獲得焦點。指令定義物件可提供多個生命週期鉤子函數,例如 mounted、updated 等。指令可以簡寫為函數,當行為在 mounted 和 updated 時相同時特別方便。
在學習 Vue 的可重用性(Reusability)時,Composables 是重要概念,專指可以重複使用的函式。這些函式利用 Vue 的 Composition API 封裝和重用有狀態的邏輯,幫助開發者在應用程式中進行常見任務的邏輯重用,例如格式化日期或追蹤鼠標位置。
Vue 的 scoped 樣式無法完全隔離全局樣式,需要採取其他策略如 BEM 命名規則或 CSS Modules 來避免衝突。未來可能也會遇到 JavaScript 衝突,因此需遵循嚴格的命名和範圍控制。
你可能也想看
Google News 追蹤
Thumbnail
Hi 我是 VK~ 在 8 月底寫完〈探索 AI 時代的知識革命:NotebookLM 如何顛覆學習和創作流程?〉後,有機會在 INSIDE POSSIBE 分享兩次「和 NotebookLM 協作如何改變我學習和創作」的主題,剛好最近也有在許多地方聊到關於 NotebookLM 等 AI 工具
Thumbnail
國泰CUBE App 整合外幣換匯、基金、證券等服務,提供簡便、低成本的美股定期定額投資解決方案。 5分鐘開戶、低投資門檻,幫助新手輕鬆進軍國際股市;提供人氣排行榜,讓投資人能夠掌握市場趨勢。
Thumbnail
這是張老師的第三本書,我想前二本應該也有很多朋友們都有讀過,我想絕對是受益良多,而這次在書名上就直接點出,著重在從投資的角度來切入
Thumbnail
在網路速度有限的情況下,依序記錄不斷產生的資訊,能統計使用者在頁面上操作了哪些功能。
Thumbnail
※ 靜態資源回傳 ※ 什麼是靜態資源: 定義:是指事先準備好的資源,這些資源在伺服器上是靜態的、不會隨著每個請求而改變。 資源通常包括: 靜態 HTML 文件。 CSS。 圖像(Image)。 Video。 字體文件:google fonts。 favicon:網頁名稱旁邊的ico
Thumbnail
在 TypeScript 中,套件是模組化代碼的集合,可以提高代碼的可重用性和可維護性。常見的套件包括各種庫和框架,如 lodash、express 等。以下是有關引用套件、自定義套件和常見套件的詳細介紹。
Thumbnail
工具功能 (1) 彈性任意查詢檔案,如對來源目錄設定,檔案修改日期 設定,檔名特定字串或副檔名設定後,自動查出明細,並可展開至各階子目錄處理     (2) 依查詢後結果,可產出 LIST ,提供查詢結果之確認,再依此對檔案作複 (3) 可對檔案作移動,複製至別處,刪除處理,使電腦可騰出硬碟空間
Thumbnail
因為最近想嘗試編碼風格,於是就選了一套比較"不嚴格"的輔助工具來摸索。 編輯器 VS CODE 框架 VUE3 打包工具 VITE 編碼風格 Standard 環境 version { "nodejs":"v18.18.0", "npm":"9.8.1" }
物件導向設計的一個重點就是封裝,這有很多層面上的意義,但基本上就是控制物件的成員變數和方法的存取權。物件導向的封裝還跟繼承機制有關,這使得有一些時候我們逼不得已必須把函式定義在類別上,這種做法使得物件的功能變得難以拆解。封裝應該是模組的職責,並不需要再給物件相同的能力。 一般的模組系統就是把相
Thumbnail
到存放虛擬機的磁碟處\點選想要註冊的機器\註冊機器(登錄虛擬機器)
Thumbnail
題目敘述 題目會給我們一組定義好的界面和需求,要求我們設計一個資料結構,可以滿足平均O(1)的插入元素、刪除元素、隨機取得元素的操作。 RandomizedSet() 類別建構子 bool insert(int val) 插入元素的function界面 bool remove(int val
Thumbnail
Hi 我是 VK~ 在 8 月底寫完〈探索 AI 時代的知識革命:NotebookLM 如何顛覆學習和創作流程?〉後,有機會在 INSIDE POSSIBE 分享兩次「和 NotebookLM 協作如何改變我學習和創作」的主題,剛好最近也有在許多地方聊到關於 NotebookLM 等 AI 工具
Thumbnail
國泰CUBE App 整合外幣換匯、基金、證券等服務,提供簡便、低成本的美股定期定額投資解決方案。 5分鐘開戶、低投資門檻,幫助新手輕鬆進軍國際股市;提供人氣排行榜,讓投資人能夠掌握市場趨勢。
Thumbnail
這是張老師的第三本書,我想前二本應該也有很多朋友們都有讀過,我想絕對是受益良多,而這次在書名上就直接點出,著重在從投資的角度來切入
Thumbnail
在網路速度有限的情況下,依序記錄不斷產生的資訊,能統計使用者在頁面上操作了哪些功能。
Thumbnail
※ 靜態資源回傳 ※ 什麼是靜態資源: 定義:是指事先準備好的資源,這些資源在伺服器上是靜態的、不會隨著每個請求而改變。 資源通常包括: 靜態 HTML 文件。 CSS。 圖像(Image)。 Video。 字體文件:google fonts。 favicon:網頁名稱旁邊的ico
Thumbnail
在 TypeScript 中,套件是模組化代碼的集合,可以提高代碼的可重用性和可維護性。常見的套件包括各種庫和框架,如 lodash、express 等。以下是有關引用套件、自定義套件和常見套件的詳細介紹。
Thumbnail
工具功能 (1) 彈性任意查詢檔案,如對來源目錄設定,檔案修改日期 設定,檔名特定字串或副檔名設定後,自動查出明細,並可展開至各階子目錄處理     (2) 依查詢後結果,可產出 LIST ,提供查詢結果之確認,再依此對檔案作複 (3) 可對檔案作移動,複製至別處,刪除處理,使電腦可騰出硬碟空間
Thumbnail
因為最近想嘗試編碼風格,於是就選了一套比較"不嚴格"的輔助工具來摸索。 編輯器 VS CODE 框架 VUE3 打包工具 VITE 編碼風格 Standard 環境 version { "nodejs":"v18.18.0", "npm":"9.8.1" }
物件導向設計的一個重點就是封裝,這有很多層面上的意義,但基本上就是控制物件的成員變數和方法的存取權。物件導向的封裝還跟繼承機制有關,這使得有一些時候我們逼不得已必須把函式定義在類別上,這種做法使得物件的功能變得難以拆解。封裝應該是模組的職責,並不需要再給物件相同的能力。 一般的模組系統就是把相
Thumbnail
到存放虛擬機的磁碟處\點選想要註冊的機器\註冊機器(登錄虛擬機器)
Thumbnail
題目敘述 題目會給我們一組定義好的界面和需求,要求我們設計一個資料結構,可以滿足平均O(1)的插入元素、刪除元素、隨機取得元素的操作。 RandomizedSet() 類別建構子 bool insert(int val) 插入元素的function界面 bool remove(int val