① vue 緩存組件keep-alive
kee-alive 是 Vue 內置的一個組件, 可以使被包含的組件保留狀態,或避免重新渲染 。也就是所謂的組件緩存
keep-alive是一個抽象的組件,緩存的組件不會被mounted,為此提供activated和deactivated鉤子函數
在2.1.0 版本後keep-alive新加入了兩個屬性: include(包含的組件緩存生效) 與 exclude(排除的組件不緩存,優先順序大於include) 。
keep-alive可以接收3個屬性做為參數進行匹配對應的組件進行緩存:
include 包含的組件(可以為字元串,數組,以及正則表達式,只有匹配的組件會被緩存)
exclude 排除的組件(以為字元串,數組,以及正則表達式,任何匹配的組件都不會被緩存)
max 緩存組件的最大值(類型為字元或者數字,可以控制緩存組件的個數)
配合router使用
1.keep-alive 先匹配被包含組件的 name 欄位,如果 name 不可用,則匹配當前組件 components 配置中的注冊名稱。
2.keep-alive 不會在函數式組件中正常工作,因為它們沒有緩存實例。
3.當匹配條件同時在 include 與 exclude 存在時,以 exclude 優先順序最高(當前vue 2.4.2 version)。比如:包含於排除同時匹配到了組件A,那組件A不會被緩存。
4.包含在 keep-alive 中,但符合 exclude ,不會調用activated和 deactivated。
參考 https://juejin.cn/post/6844903918313406472
參考 https://www.imooc.com/article/302879
② vue3使用 keep-alive對iframe進行緩存
使用keep-alive緩存不了iframe界面原因
【1】原理:Vue 的緩存機制並不是直接存儲 DOM 結構,而是將 DOM 節點抽象成了一個個 VNode節點。因此,Vue 的 keep-alive 緩存也是基於 VNode節點 而不是直接存儲 DOM 節點。在需要渲染的時候從Vnode渲染到真實DOM上。
【2】參數:Keep-alive 組件提供了 include 和 exclude 兩個屬性,允許組件有條件的進行緩存。
include: 字元串或正則表達式。只有匹配的組件會被緩存。
exclude: 字元串或正則表達式。任何匹配的組件都不會被緩存。
【3】Keep-alive 組件提供了兩個生命鉤子函數,分別是 activated 和 deactivated 。
activated :當頁面存在緩存的時候執行該函數。
deactivated :在頁面結束時觸發該方法,可清除掉滾動方法等緩存。
iframe頁里的內容並不屬於節點的信息,所以使用keep-alive依然會重新渲染iframe內的內容。而且iframe每一次渲染就相當於打開一個新的網頁窗口,即使把節點保存下來,在渲染時iframe頁還是刷新的。
不使用 keep-alive ,因為vnode原理不適用。直接把打開過得iframe中的dom保存下來。通過v-show顯示隱藏
iframeComponentsArray這個數組是打開過的iframe頁面數組
③ 在Vue中如何緩存頁面
在Vue中經常會遇到需要緩存頁面的情況,如果不對Vue進行處理,那麼Vue默認是不會緩存頁面的。例如從菜譜列表界面進入到菜譜的詳情頁後,再從菜譜詳情頁中返回到菜譜列表頁面中時,菜譜列表是不需要進行刷新的,一個是增加了不必要的網路請求,第二個是如推薦菜譜後台是實時推薦的,每次請求的數據都不一定一樣的,這樣在用戶退出後甚至找不到之前的進入位置,造成了很不好的用戶體驗。類似的情況還有很多,那麼如何在Vue中控制頁面是否刷新呢?
設置方法
注意:以上兩種方法都可以對路由是否緩存進行設置,如果不論何種情況下都要緩存頁面,可以直接採用第一種方法,當然第二種情況同樣可以滿足情況;但是如果需要區分從不同頁面跳轉的情況來確定是否需要緩存的話,就需要用到第二種方法。
④ vue使用keep-alive實現頁面前進刷新,後退緩存
vue中,我們有時候需要實現這種場景:
1.搜索頁面到列表頁面,需要刷新重新獲取數據。
2.從詳情頁面返回列表頁面需要記住上次瀏覽的狀態。具體流程如下:
第一步:在路由配置文件中為列表頁設置meta參數,裡麵包含useCatch和keepAlive
第二步:在App文件中如下設置
第三步:在列表頁面添加leaveTag欄位,當點擊返回按鈕觸發返回事件的時候,將leaveTag修改為back,然後在beforeRouteLeave中如下:
第四步:在列表頁的actived生命周期函數中根據useCatch欄位判斷是否需要緩存:
這種處理方式會有bug,打開列表頁會有上次的殘留停頓一下,最新文章已解決,詳情請看我的最新文章。
⑤ Vue 怎麼緩存當前的組件緩存後怎麼更新說說你對keep-alive的理解是什麼
keep-alive 是 vue 中的內置組件,能在組件切換過程中將狀態保留在內存中,防止重復渲染 DOM
keep-alive 包裹動態組件時,會緩存不活動的組件實例,而不是銷毀它們
keep-alive 可以設置以下 props 屬性:
關於 keep-alive 的基本用法:
使用 includes 和 exclude :
匹配首先檢查組件自身的 name 選項,如果 name 選項不可用,則匹配它的局部注冊名稱 (父組件 components 選項的鍵值),匿名組件不能被匹配
設置了 keep-alive 緩存的組件,會多出兩個生命周期鉤子( activated 與 deactivated ):
使用原則:當我們在某些場景下不需要讓頁面重新載入時我們可以使用 keepalive
舉個栗子:
當我們從 首頁 –> 列表頁 –> 商詳頁 –> 再返回 ,這時候列表頁應該是需要 keep-alive
從 首頁 –> 列表頁 –> 商詳頁 –> 返回到列表頁(需要緩存) –> 返回到首頁(需要緩存) –> 再次進入列表頁(不需要緩存) ,這時候可以按需來控制頁面的 keep-alive
在路由中設置 keepAlive 屬性判斷是否需要緩存
使用 <keep-alive>
keep-alive 是 vue 中內置的一個組件
源碼位置:src/core/components/keep-alive.js
可以看到該組件沒有 template ,而是用了 render ,在組件渲染的時候會自動執行 render 函數
this.cache 是一個對象,用來存儲需要緩存的組件,它將以如下形式存儲:
在組件銷毀的時候執行 pruneCacheEntry 函數
在 mounted 鉤子函數中觀測 include 和 exclude 的變化,如下:
如果 include 或 exclude 發生了變化,即表示定義需要緩存的組件的規則或者不需要緩存的組件的規則發生了變化,那麼就執行 pruneCache 函數,函數如下:
在該函數內對 this.cache 對象進行遍歷,取出每一項的 name 值,用其與新的緩存規則進行匹配,如果匹配不上,則表示在新的緩存規則下該組件已經不需要被緩存,則調用 pruneCacheEntry 函數將其從 this.cache 對象剔除即可
關於 keep-alive 的最強大緩存功能是在 render 函數中實現
首先獲取組件的 key 值:
拿到 key 值後去 this.cache 對象中去尋找是否有該值,如果有則表示該組件有緩存,即命中緩存,如下:
直接從緩存中拿 vnode 的組件實例,此時重新調整該組件 key 的順序,將其從原來的地方刪掉並重新放在 this.keys 中最後一個
this.cache 對象中沒有該 key 值的情況,如下:
表明該組件還沒有被緩存過,則以該組件的 key 為鍵,組件 vnode 為值,將其存入 this.cache 中,並且把 key 存入 this.keys 中
此時再判斷 this.keys 中緩存組件的數量是否超過了設置的最大緩存數量值 this.max ,如果超過了,則把第一個緩存組件刪掉
解決方案可以有以下兩種:
每次組件渲染的時候,都會執行 beforeRouteEnter
在 keep-alive 緩存的組件被激活的時候,都會執行 actived 鉤子
注意:伺服器端渲染期間 avtived 不被調用
⑥ vue頁面緩存(keepAlive)
同人博客搬遷~~~~(播客主頁: https://www.cnblogs.com/epines/ )
頁面緩存在頁面中長期會使用到,可以更快速的在頁面切換期間的資源獲取
主要是用keep-alive實現
在vue項目中,相關的寫法比較多,還有一些注意點需要仔細
第一種方式
在App.vue中
添加標簽
<keep-alive>
<router-view />
</keep-alive>
這會就是所有的頁面都會被緩存
這里做了兩個頁面的相互跳轉,分別寫了一個輸入框,在輸入內容後,跳轉時,輸入的內容因為緩存的原因會被保留
如果存在某些頁面需要緩存,那麼可以通過keep-alive的屬性去處理
其中就是include和exclude
include:名稱匹配的組件才會被緩存,其中可以寫字元串或正則表達式
exclude:名稱匹配的組件不會被緩存,其中同樣是字元串或正則表達式
這里的名稱是指組件的名稱
<script>
export default {
name: 'HelloWorld'
}
</script>
第二種方式:
在路由中進行設置通過添加meta,route/index.js
export default new Router({
routes: [{
path: '/',
name: 'HelloWorld',
component: HelloWorld,
meta: {
keepAlive: true // 該路由會被緩存
}
},
{
path: '/ss',
name: 'ss',
component: Ss,
meta: { keepAlive:false // 該路由不會被緩存,不需要緩存的時候該屬性可以不用寫 }
}]
})
這時候頁面還需要通過該屬性進行判斷是否緩存
在App.vue
<keep-alive>
<router-view v-if="$route.meta.keepAlive">
</router-view>
</keep-alive>
<router-view v-if="!$route.meta.keepAlive">
</router-view>
這樣寫有個優點就是,需要緩存不需要緩存的name可以隨便寫,不需要做什麼規律性的去寫出一個合適的正則去匹配上,就會更加靈活些
常見的應用場景可以是,列表到詳情頁,從詳情頁返回到列表頁,如果說列表頁沒有做緩存,在單頁面下,會直接返回列表首頁(存在分頁的情況),就不能直接返回至之前離開的列表頁,所以這個地方在列表頁添加頁面緩存後,可以做到返回至之前離開的列表頁
沒有緩存的時候,返回列表:
有緩存的時候,返回列表
所以從某些程度上來講,即增加了頁面的響應速度,又增加了用戶體驗,總體來說,還是比較實用的
⑦ vue頁面緩存,keep-alive第一次無效的解決方法
方法二:使用 include + beforeRouteLeave + vuex 與方法一相似,不同的地方在於,將需要緩存的組件保存到全局變數,可以在路由的鉤子函數里靈活的控制哪些組件需要緩存,那些不需要緩存;跟方法一相比,不需要每次再重新初始化數據,但是需要在vuex中保存數據;
1、在創建router實例的時候加上scrollBehavior方法
2、將需要緩存的組件加在include屬性里
3、在store里加入需要緩存的的組件的變數名,和相應的方法;
4、在beforeRouteLeave鉤子函數里控制需要緩存的組件
⑧ 移動端Vue界面緩存處理
大家可以看到當重新進入列表頁數據進行了刷新這明顯不符合需求
查網路問同事知道了一個東西叫keep-alive於是決定使用這個內置組件試試.
然後吧發現問題確實能夠得到結局但是出了個新問題如圖:
問題1:界面雖然被緩存但是當退出到前一個頁面再進入的時候界面還是被緩存狀態,我覺得這是不合理的.
問題2:被緩存的界面從上個頁面再次進入時動畫效果不對.
基於這兩個問題我也查了一些資料和博客,也總結了第二套方案
這個rank是用來判斷當前組件所在的級別.
比如A組件->B組件 ->C組件,那麼A的rank為1,B的rank為2,C的rank為3,
在beforeRouteLeave中
這個貌似能解決問題,但是!!!
問題1: 這個返回動畫就是不對...(圖片在瀏覽器可能看不出啥問題,在真機很明顯)因為這個框架是前端給的動畫我也不會弄...如果能解決跳轉動畫問題,我覺得這個方案基本可以符合要求..如果有大佬可以解決,方便的話指導下小弟.而且能解決這個動畫問題後面也不用看了...
問題二:有的時候會出現緩存了上一次的bug(也不知道咋回事...出現的還挺頻繁..).
在這里就是我自己總結的一個方案..雖然能完美解決這些問題不過對開發不友好,維護成本太高..不建議使用(如果實在沒辦法的話)
首先在vuex中定義需要緩存的界面的數據(先測試的滑動,所以分開寫的可以只寫一個data)
先說下高度的滑動吧這個滑動的高度也是需要保存的.界面中沃使用cube-ui的scroll組件
給data增加一個scrollHeight屬性緩存界面高度.還有需要緩存的數據model
當界面滑動停止調用scrollend方法對scrollHeight進行賦值
每次進入界面即在created 函數中取出緩存的高度,如果有高度那麼讓它自動滑動.並重新給scrollHeight進行賦值.
這邊是我封裝的一個js..實現是這樣的
這樣就可以保證滑動的緩存(data與高度類似).
這是data的js
當界面進行跳轉對組件的rank進行判斷如下:
而在進入的時候
⑨ vue中動態路由組件緩存及生命周期函數
<keep-alive>是Vue的內置組件,能在組件切換過程中將狀態保留在內存中,防止重復渲染DOM。<keep-alive> 包裹動態組件時,會緩存不活動的組件實例,而不是銷毀它們。和 <transition> 相似,<keep-alive> 是一個抽象組件:它自身不會渲染一個 DOM 元素,也不會出現在父組件鏈中。prop :
有兩個生命周期函數:
activated :激活
deactivated :失活
利用keep-alive實現滾動條保存:
思路 : 在路由頁面離開 beforeRouterEnter 中保存當前滾動條距離頂部的位置,再用 activated 鉤子函數 當他再次被激活時,讓他的滾動條等於離開時保存的那個值。
beforeCreate :組件實例剛被創建,組件屬性計算之前,如data屬性等
created :組件實例創建完成,屬性已綁定,但DOM還未生成,$el屬性還不存在
beforeMount :模板編譯 / 掛載之前
mounted :模板編譯 / 掛載之後
beforeUpdate :組件更新之前
updated :組件更新之後
activated :組件被激活時調用
deactivated :組件被移除時調用
beforeDestory :組件銷毀前調用
destoryed :組件銷毀後調用
(1) 創建階段
創建的標志點是New vue(),beforeCreate和created都發生在創建動作之後,但區別在於beforeCreate觸發的時候數據還沒初始化和綁定,而created的時候就生成好了。
(2) 掛載階段
beforeMount和mounted兩者主要區別在於模板是否編譯和掛載了。
(3) 更新階段
beforeUpdate 和 updated 就是當數據發生變化的時候出發的。
(4) 銷毀階段
beforeDestory 和 destoryed 的區別就是el的值data的數據依然在的。這是因為$destroy只是銷毀一個實例,清理它與其它實例的連接,解綁它的全部指令及事件監聽器,並不會清除data的數據或者清除dom。
⑩ vue頁面緩存設置,動態設置頁面緩存
情景:A頁面—>B頁面—>C頁面,A頁面去B頁面期望B頁面不緩存,B頁面去C頁面時,期望B頁面可以被緩存。(實際場景可以是:A為首頁,B為列表頁,C為詳情頁,B滾動翻頁後,從C返回B,記錄滾動位置。)
通過路由訪問鉤子設置B頁面的keepAlive為true或者false。
離開路由後,判斷to.name是否是A的路由名,是的話設置為false,否則設置為true。注意B頁面的keepAlive要設置為true。
2.通過vuex結合路由的includes功能以及路由鉤子函數實現。(推薦,實現起來優雅)
3.聲明一個初始化頁面狀態,內部變數的函數,從a 頁面進入執行初始化函數,其餘情況不執行。視圖依賴數據驅動,所以可以實現效果。