vue中keepAlive組件的作用和使用方法詳解
前言
在面試的時候,很多面試官再問vue的時候可能就會提一嘴,你知道keep-alive有什么作用嗎?
keep-alive是vue內(nèi)置的一個組件,而這個組件的作用就是能夠緩存不活動的組件,我們能夠知道,一般情況下,組件進行切換的時候,默認會進行銷毀,如果有需求,某個組件切換后不進行銷毀,而是保存之前的狀態(tài),那么就可以利用keep-alive來實現(xiàn)
<keep-alive>是Vue的內(nèi)置組件,能在組件切換過程中將狀態(tài)保留在內(nèi)存中,防止重復渲染DOM。
<keep-alive> 包裹動態(tài)組件時,會緩存不活動的組件實例,而不是銷毀它們。和 <transition> 相似,<keep-alive> 是一個抽象組件:它自身不會渲染一個 DOM 元素,也不會出現(xiàn)在父組件鏈中。
我這里利用腳手架創(chuàng)建項目后會生成home和about兩個組件,并且通過路由進行切換
home組件
<template>
<div class="home">
<input type="text">
</div>
</template>
<script>
// @ is an alias to /src
import HelloWorld from '@/components/HelloWorld.vue'
export default {
name: 'home',
components: {
HelloWorld
}
}
</script>
我在home組件中寫了一個input輸入框
about組件
<template>
<div class="about">
<input type="text">
</div>
</template>
<script>
export default {
name:"about"
}
</script>
同樣的about組件也放了一個輸入框

當我們在home組件的輸入框輸入一些內(nèi)容的時候,然后切換到about組件,在切換回home組件,我們會發(fā)現(xiàn)之前輸入的內(nèi)容被清空了,其實也容易理解,就是當切換到about組建的時候,home組件就被銷毀了,輸入框的值自然被清空了

我在home組件寫了destroyed生命周期函數(shù)

當切換到about組件的時候home組件的destroyed就觸發(fā)了,所以home組件被銷毀了
那么此時我們就可以利用keep-alive組件進行包裹router-view組件,將不活動的組件緩存起來
App組件
<template>
<div id="app">
<div id="nav">
<router-link to="/">Home</router-link> |
<router-link to="/about">About</router-link>
</div>
<keep-alive>
<router-view />
</keep-alive>
</div>
</template>
寫完之后會發(fā)現(xiàn)當切換到about組件時,home組件中的destroyed并沒有觸發(fā),并且home組件的值也保存了下來

但是這樣也肯定不好,我們會發(fā)現(xiàn),about組件的值也被緩存了,就是所有的路由組件都被緩存了,嚴重浪費性能,而且也不符合需求,我們現(xiàn)在只想緩存home組件
在keep-alive上有兩個屬性
字符串或正則表達式。只有匹配的組件會被緩存。
- include 值為字符串或者正則表達式匹配的組件name會被緩存。
- exclude 值為字符串或正則表達式匹配的組件name不會被緩存。
首先利用include實現(xiàn),匹配到組件中定義的name,將進行緩存
<keep-alive include="home"> <router-view /> </keep-alive>

我們會發(fā)現(xiàn)home已經(jīng)被緩存了,但是about沒有被緩存
而exclude就是排除了,這個就不在演示了,很簡單,除了這個我們還可以利用路由中的meta屬性來控制
{
path: '/',
name: 'home',
meta:{
keepAlive:true
},
component: Home
}
將home的路由規(guī)則鐘的meta添加keepAlive屬性為true,也就是當前路由組件要進行緩存
keep-alive代碼可以結(jié)合v-if進行包裹,如果meta中的keepAlive為true進行緩存,否側(cè)不進行緩存,這樣可以更靈活一些
<keep-alive>
<router-view v-if="$route.meta.keepAlive" />
</keep-alive>
<router-view v-if="!$route.meta.keepAlive" />
這樣組件的緩存是實現(xiàn)了,但是還是會有一些問題,就是因為組件被緩存,并沒有被銷毀,所以組件在切換的時候也就不會被重新創(chuàng)建,自然也就不會調(diào)用created等生命周期函數(shù),所以此時要使用activated與deactivated來獲取當前組件是否處于活動狀態(tài)
我在home組件里面寫入了activated與deactivated生命周期函數(shù)
activated(){
console.log("哎呀看見我了")
console.log("----------activated--------")
},
deactivated(){
console.log("討厭??!你又走了")
console.log("----------deactivated--------")
}

通過上面的gif圖相信已經(jīng)看得很清楚了,此時keep-Alive也就差不多了
總結(jié)
到此這篇關于vue中keepAlive組件作用和使用方法的文章就介紹到這了,更多相關vue中keepAlive組件使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
解決vue語法會有延遲加載顯現(xiàn){{xxx}}的問題
今天小編就為大家分享一篇解決vue語法會有延遲加載顯現(xiàn){{xxx}}的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-11-11
詳解Vue實戰(zhàn)指南之依賴注入(provide/inject)
這篇文章主要介紹了詳解Vue實戰(zhàn)指南之依賴注入(provide/inject),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-11-11
Vue中使用iframe踩坑問題記錄 iframe+postMessage
這篇文章主要介紹了Vue中使用iframe踩坑問題記錄 iframe+postMessage,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-09-09
Vue3使用hooks函數(shù)實現(xiàn)代碼復用詳解
這篇文章主要介紹了Vue3使用hooks函數(shù)實現(xiàn)代碼復用詳解,Vue3的hook函數(shù)可以幫助我們提高代碼的復用性,?讓我們能在不同的組件中都利用hooks函數(shù)2022-06-06
vue2響應式原理之Object.defineProperty()方法的使用
這篇文章主要介紹了vue2響應式原理之Object.defineProperty()方法的使用,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-10-10

