① 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 keepAlive 二次進入頁面顯示首次緩存問題
問題場景: 當某個帶有篩選條件查詢列表的頁面需要進行緩存,以便不再需要重復進行選擇或者輸入篩選條件的時候,我們就可以利用keepAlive來進行緩存,但keepAlive也存在著一些坑,這是需要注意的地方。
如何利用keepAlive進行緩存
1、在路由meta內定義keepAlive,來設置需要被緩存的頁面
meta: { keepAlive: true }
ture: 需要緩存的路由;false:不需要緩存的路由
2、判斷router-view
被keep-alive包裹的為需要緩存的頁面,這樣我們就可以通過keepAlive來切換哪些頁面需要緩存,哪些不需要緩存。
3、進入詳情頁面緩存,否則不緩存
路由守衛鉤子 beforeRouteLeave 離開頁面路由的時候出發; 當離開緩存頁面,進入詳情頁面的時候,我們將緩存頁面keepAlive設置true,如果離開緩存頁面,不是進入詳情頁面的時候,我們設置為false,不進行緩存。
這是最基本的緩存設置,但是keepAlive也留下了一個大坑。
keepAlive二次進入頁面顯示首次緩存問題
第一次從緩存頁面進入詳情頁再返回到緩存頁面的時候,頁面條件能被正確的緩存下來,但是當我們切換到別的路由,再一次進入該緩存頁修改查詢條件,並進入詳情後返回緩存頁,此時緩存的是頁面狀態是第一次進入該頁面的時候的狀態,也就是說,第二次進入頁面的時候,該緩存讀取的是第一次的緩存,這就非常的坑了。 所以通過下面的刷新緩存路由的方式來解決這個問題。
1、調整 router-view
定義一個isRouterAlive變數,用來刷新keep-alive;通過provide向下面子孫組件們暴露一個reload方法,用來刷新緩存。
2、設置緩存
子組件注冊inject: ['reload'] 方法,beforeRouteEnter鉤子在進入緩存頁面的時候通過通過判斷路由是否是來自詳情頁面,如果不是詳情頁,我們就刷新緩存,如果是詳情頁,就不做處理。 這樣就解決了,只要是路由進入過別的頁面(非詳情頁面),我們就刷新緩存,這樣就不會出現二次進入的時候,顯示的是第一次的緩存狀態,同時從詳情頁返回後正常顯示緩存數據。
③ 退出登錄後清除keepalive緩存
最近項目中被一個keep-alive的問題困擾了很久,項目中有四個頁面使用了keep-alive,導致用戶退出登錄後,使用其他賬號登錄時,還保存著前一個用戶的信息,經歷了一系列的暴力刪除無效後,最終採用了以下方法,用戶退出登陸後移除keep-alive:
參考了:
https://stackoverflow.com/questions/48661595/how-to-destroy-a-vuejs-component-that-is-being-cached-by-keep-alive
https://zhuanlan.hu.com/p/40374425
④ vue頁面緩存,keep-alive第一次無效的解決方法
方法二:使用 include + beforeRouteLeave + vuex 與方法一相似,不同的地方在於,將需要緩存的組件保存到全局變數,可以在路由的鉤子函數里靈活的控制哪些組件需要緩存,那些不需要緩存;跟方法一相比,不需要每次再重新初始化數據,但是需要在vuex中保存數據;
1、在創建router實例的時候加上scrollBehavior方法
2、將需要緩存的組件加在include屬性里
3、在store里加入需要緩存的的組件的變數名,和相應的方法;
4、在beforeRouteLeave鉤子函數里控制需要緩存的組件
⑤ 如何清除緩存屬性 keepalive vue
一般手機運行內存不足,或手機內存,手機存儲空間不足的時候,手機都會出現這種提示的哦!
解決方法:
1.進入設置--存儲——首選安裝位置——選擇用戶空間(手機存儲)。
2.把安裝在系統空間的程序移動到用戶空間中,設置——程序管理(或應用程序)——全部——點擊程序—移動至用戶空間(手機存儲)。
3.做完以上操作之後建議你可以定期給手機清理下緩存,從而為手機釋放一些空間,
3.也可以盡量卸載一些不必要的軟體,以免佔用手機內存。一次不要運行過多程序的,運行程序過多,運行內存可以不足的。
4.清理緩存的操作----長按關機鍵10秒直至進入完全關機狀態,然後同時按住電源鍵跟音量減鍵,進入工程模式,通過音量鍵選擇清理緩存選項,電源鍵確定,系統將自動清理緩存哦