vue中keep-alive組件的入門使用教程
一、問題觸發(fā)并解決
最近自己在寫vue練習,內(nèi)容相對簡單,主要是對vue進行熟悉和相關問題發(fā)現(xiàn),查漏補缺。簡單說下練習的項目內(nèi)容及問題的產(chǎn)生:
練習使用的vue-cli 2.0腳手架搭建,內(nèi)容就是簡單的仿音樂播放app,功能也相對簡單,大體就是單頁router切換各個專輯列表,點擊進入專輯內(nèi)容頁面,單擊歌曲名稱可以進行播放、暫停、下一曲功能。
簡單的背景介紹完了,說下問題產(chǎn)生的情形:在從整個歌曲列表頁點擊跳轉到單個專輯列表頁,然后點擊返回按鈕返回歌曲列表頁時,頁面保存了之前的瀏覽位置,但是接口重新請求了數(shù)據(jù),因為歌曲列表頁有滾動加載效果,所以數(shù)據(jù)獲取在vuex里用了數(shù)組的concat方法,導致返回請求的數(shù)據(jù)重新加載了列表里,而v-for循環(huán)由于key值有了重復,導致控制臺報錯;說起來可能比較難懂,上一些基本的代碼部分:
vuex里獲取列表數(shù)據(jù):
GET_COLLECTION_LIST(state, val) { state.collectionList = state.collectionList.concat(val)}
歌曲列表里created獲取數(shù)據(jù),mounted監(jiān)聽滾動事件滾動加載,destroyed取消監(jiān)聽:
created(){ this.collectionListMethod({limit: this.limit, offset: this.offset})},
mounted(){ window.addEventListener('scroll', this.isScrollBot)}
destroyed(){ window.removeEventListener('scroll', this.isScrollBot)}
專輯列表頁返回使用的是 this.$router.go(-1)
有問題就要解決問題,通過查詢了解到keep-alive可以對數(shù)據(jù)進行緩存,路由切換的時候可以使用緩存不用重新觸發(fā)接口請求,貌似可以很完美解決問題,實踐出真知,在代碼里添加:
首先在歌曲列表路由里添加meta:{keepAlive: true}為后面的router-view是否需要緩存提供標識
{ path: '/songLis', component: SongLis, meta: { keepAlive: true }}
然后在router-view外層添加keep-alive,并根據(jù)meta參數(shù)判斷是否所有路由都需要緩存
<keep-alive>
<router-view v-if="$route.meta.keepAlive" />
</keep-alive>
<router-view v-if="!$route.meta.keepAlive"/>
添加完畢,回到頁面看效果!可喜可賀的是控制臺不報錯了,說明keep-alive起作用了,撒花慶祝~~~ 但是事情并沒有那么簡單,當我們從專輯列表切到其他路由,滾動鼠標會發(fā)現(xiàn)滾動加載的監(jiān)聽事件沒有取消,組件destroyed的時候明明取消監(jiān)聽了??!而且再切回到專輯列表頁的時候,滾動加載反而不執(zhí)行了,表示一臉懵~
經(jīng)過查看vue文檔,發(fā)現(xiàn)文檔有這么一句話:
<keep-alive> 包裹動態(tài)組件時,會緩存不活動的組件實例,而不是銷毀它們。
也就是說使用keep-alive的組件不會觸發(fā)destroyed鉤子方法,這就是取消監(jiān)聽失敗的原因。根據(jù)文檔介紹,keep-alive切換時,會觸發(fā)自己的activeted和deactiveted兩個鉤子函數(shù),可以理解為vue的created和destroyed兩個鉤子,因此需要修改代碼,在deactivated時候取消監(jiān)聽,同時在activated的時候恢復監(jiān)聽,否則切回去的時候滾動監(jiān)聽也不會有效果:
//keep-alive鉤子函數(shù),組件恢復時觸發(fā)
activated(){ window.addEventListener('scroll', this.isScrollBot)},
//keep-alive鉤子函數(shù),組件變?yōu)椴豢捎脮r觸發(fā)
deactivated(){ window.removeEventListener('scroll', this.isScrollBot)}
修改后的效果完全符合預期,切換路由頁面保留當位置,不會重復請求接口而且也不會在專輯列表組件外部觸發(fā)滾動加載。
二、關于keep-alive
既然用到了keep-alive,就通過文檔簡單總結下相關使用:
上面已經(jīng)說過,通過keep-alive包裹的組件,在不活動時會緩存組件實例,不會對組件進行銷毀,再次處于活動狀態(tài)時,會讀取緩存的內(nèi)容并保存組件狀態(tài),不用重復請求接口獲取數(shù)據(jù)。
(1)最基本使用基本用法:
基本用法: <keep-alive> <component :is="view"></component> </keep-alive> 也可以根據(jù)條件判斷: <keep-alive> <comp-a v-if="a > 1"></comp-a> <comp-b v-else></comp-b> </keep-alive> 這個時候觸發(fā)兩個組件切換時,組件內(nèi)的數(shù)據(jù)和狀態(tài)都會得到保存,如果有input輸入框,輸入框內(nèi)容會保留
(2)有條件的緩存
keep-alive提供了include、exclude、max三個參數(shù),前兩個允許組件有條件的進行緩存,兩者都可以接受字符串、正則、數(shù)組形式;max表示最多可以緩存多少個組件,接受一個number類型。
<keep-alive include="a,b"> <component :is="view"></component> </keep-alive> 此時只有a、b兩個組件會觸發(fā)keep-alive,此處的名字是組件內(nèi)部name對應名字,如果name不存在,會查找父組件里components里注冊的名字,如果也不存在則不會匹配。 正則和數(shù)組方法同上,但是需要用v-bind:include=''方式。 <keep-alive :max="10"> <component :is="view"></component> </keep-alive>
(3)鉤子函數(shù)
兩個鉤子函數(shù)activated和deactivated,上面已經(jīng)說過,分別在組件恢復活動狀態(tài)和組件失去活動狀態(tài)時觸發(fā),可以起到類似created和destroyed鉤子作用。
以上是對keep-alive的個人使用和理解,如有不足還望指正~
總結
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。
相關文章
解決VUE mounted 鉤子函數(shù)執(zhí)行時 img 未加載導致頁面布局的問題
這篇文章主要介紹了解決VUE mounted 鉤子函數(shù)執(zhí)行時 img 未加載導致頁面布局的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-07-07
前端vue面試總問watch和computed區(qū)別及建議總結
在現(xiàn)代前端的面試中,vue和react是面試過程中基本必問的技術棧,其中Vue響應式話題,watch和computed是面試官非常喜歡聊的主題,雖然watch和computed它們都用于監(jiān)聽數(shù)據(jù)的變化,但它們在實現(xiàn)原理、使用場景和行為上有著顯著的區(qū)別,本文將深入探討,并提供一些面試過程中的建議2023-10-10
vue2.x 通過后端接口代理,獲取qq音樂api的數(shù)據(jù)示例
今天小編就為大家分享一篇vue2.x 通過后端接口代理,獲取qq音樂api的數(shù)據(jù)示例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-10-10
解決vue-element-admin安裝依賴npm install報錯問題
這篇文章主要介紹了解決vue-element-admin安裝依賴npm install報錯問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-06-06
vue中el-form-item展開項居中的實現(xiàn)方式
這篇文章主要介紹了vue中el-form-item展開項居中的實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-10-10
vue 實現(xiàn)強制類型轉換 數(shù)字類型轉為字符串
今天小編就為大家分享一篇vue 實現(xiàn)強制類型轉換 數(shù)字類型轉為字符串,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-11-11

