国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

詳解基于vue的移動web app頁面緩存解決方案

2024-05-06 15:13:24
字體:
來源:轉載
供稿:網友

現在移動web app越來越熱門了,許多公司開始嘗試使用angular、react、vue等MVVM框架來開發單頁架構的web app。但在開發web app時,如果希望頁面的導航體驗也接近原生應用,那一般都會遇到這兩個問題:

識別前進后退行為 后退時恢復之前的頁面

筆者開發了一個基于vue與vue-router的導航庫vue-navigation,來幫助開發者來解決這些問題,下面是問題的解決思路。

識別前進后退

先說第一個問題。和原生app不一樣,瀏覽器中主要有這幾個限制:

沒有提供前進后退的事件 不允許開發者讀取瀏覽記錄 用戶可以手動輸入地址,或使用瀏覽器提供的前進后退來改變url

解決方案是自己維護一份瀏覽記錄,每次url改變時,通過與記錄的瀏覽記錄作對比,從而判斷出前進后退行為:

url存在于瀏覽記錄中即為后退 url不存在于瀏覽記錄中即為前進 url在瀏覽記錄的末端即為刷新

另外,應用的路由路徑中可能允許相同的路由出現多次(例如A->B->A),所以給每個路由添加一個key值來區分相同路由的不同實例。

這個瀏覽記錄需要存儲在sessionStorage中,這樣用戶刷新后瀏覽記錄也可以恢復。

后退時恢復之前的頁面

識別出后退行為后,下一步就是像原生一樣恢復之前的頁面了。

一種方案是頁面繼續存儲在DOM中,添加樣式display: none來告訴瀏覽器不渲染該元素,但是緩存的頁面多了DOM就會變得很大,會影響頁面的性能,本文不討論這個方案。

另一種方案是將數據緩存到內存中,開發者需要將頁面的數據存儲起來,當返回到該頁面時,再根據數據將頁面恢復。但是這樣每個頁面存儲的數據不通,一般需要進行額外的編碼,如果有一種更底層的方案能解決這個問題,并且對開發者是透明的,就最好了,所以嘗試并開發了vue-navigation。

在vue-navigation 0.x版本的時候,借助了vue的keep-alive來緩存頁面,但是keep-alive是根據組件的name或tag來決定緩存的,所以帶來了很多限制。

通過拜讀keep-alive的源碼,了解到它的緩存機制后,就自己實現了一個管理緩存的組件,來靈活地緩存子組件,實現思路如下:

    每次render時,先取到子組件的vnode(vue的虛擬dom) 計算出vnode的key,把key值賦給vnode避免vue-router復用組件實例 根據key值判斷該節點是否已緩存
      已緩存:將緩存的實例賦給componentInstance,這樣vue就會根據這個實例來恢復組件 未緩存:將vnode存儲到內存中,下次返回到該頁面時可以從內存中恢復

另外還需要添加一個清除緩存的邏輯,當自己維護的瀏覽記錄變化時,根據瀏覽記錄清除不需要的緩存(例如當前的路由是:A->B->C,用戶從C直接返回到了A,那么B和C都需要從緩存中刪除)。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 新建县| 噶尔县| 荔浦县| 巨野县| 县级市| 大竹县| 济宁市| 集安市| 拉萨市| 屯留县| 赤峰市| 娄底市| 丹凤县| 龙州县| 陇西县| 新源县| 昂仁县| 商都县| 宁津县| 保定市| 昭通市| 虎林市| 祥云县| 普陀区| 东安县| 内江市| 星座| 利津县| 龙山县| 潞城市| 南汇区| 来安县| 乌拉特后旗| 仁怀市| 柳江县| 灵宝市| 嘉黎县| 思茅市| 西吉县| 肥东县| 会昌县|