摘要:路由記憶名詞解釋在中后臺系統(tǒng)開發(fā)中,訪問任何頁面時,認(rèn)證是永遠(yuǎn)繞不過的檻。這個過程,暫且稱之為路由記憶,前面例子中的登錄頁面稱之為記憶節(jié)點。
SPA 路由記憶 名詞解釋
在中后臺系統(tǒng)開發(fā)中,訪問任何頁面時,認(rèn)證是永遠(yuǎn)繞不過的檻。以登錄為例,如果檢測出當(dāng)前用戶未登錄,會強(qiáng)制跳轉(zhuǎn)到登錄頁面提示用戶進(jìn)行登錄。登錄完成后,系統(tǒng)需要跳轉(zhuǎn)至用戶原先想訪問的頁面。這個過程,暫且稱之為路由記憶,前面例子中的登錄頁面稱之為記憶節(jié)點。
解決方案由前面的例子我們不難得出路由記憶的關(guān)鍵邏輯:
進(jìn)入記憶節(jié)點時記錄目標(biāo)頁面
離開記憶節(jié)點時跳往目標(biāo)頁面(如果存在)
// 目標(biāo)頁面 const target = undefined;
但如此只能滿足存在一個記憶節(jié)點的應(yīng)用,而實際開發(fā)中,我們可能需要多個記憶節(jié)點。當(dāng)應(yīng)用中存在多個記憶節(jié)點時,問題就會慢慢的浮現(xiàn)。
接下來,我們對上面的方案進(jìn)行擴(kuò)展。
記憶節(jié)點集合首先,我們需要維護(hù)一個記憶節(jié)點的集合:
// 記憶節(jié)點集合 const nodes = [];上次訪問記錄
在這之前我們得先思考一個問題:由記憶節(jié)點跳往記憶節(jié)點時,是否需要觸發(fā)路由記憶?
當(dāng)然不需要?。?!
當(dāng)進(jìn)入記憶節(jié)點時,我們首先得判斷上一個訪問頁面是否為記憶節(jié)點,是則忽略,否則記錄目標(biāo)頁面。
在這之前,我們需要定義一個變量用來記錄上次訪問頁面,這個變量僅記錄上次訪問頁面即可,無論是否為記憶節(jié)點:
// 上次訪問頁面 const previous = undefined;記錄目標(biāo)頁面
為保證路由記憶結(jié)果的質(zhì)量,我們需要對每次路由跳轉(zhuǎn)結(jié)束進(jìn)行監(jiān)控(不論成功、取消或者失?。?。
結(jié)合前面的例子,我們現(xiàn)在不難得出,只有在常規(guī)頁面進(jìn)入記憶節(jié)點時,需要對目標(biāo)頁面進(jìn)行記錄。
/** * @param to {string} 去往頁面 */ function mark (to) { // 備份上次訪問頁面,防止被覆寫 const backup = previous; // 記錄上次訪問頁面 previous = to; // 如果上一個訪問頁面是記憶節(jié)點,中斷函數(shù) if (~nodes.indexOf(backup)) return; // 如果去往頁面不是記憶節(jié)點,中斷函數(shù) if (!~nodes.indexOf(to)) return; // 記錄目標(biāo)頁面 target = backup; }跳往目標(biāo)頁面
在每次路由跳轉(zhuǎn)之前,我們需要檢測是否是記憶節(jié)點進(jìn)入常規(guī)頁面且是否存在目標(biāo)頁面記錄,如果條件都滿足,則打斷原有操作跳往目標(biāo)頁面,并清空目標(biāo)頁面記錄。
/** * @param to {string} 去往頁面 */ function check (to) { // 若目標(biāo)頁面不存在,中斷函數(shù) if (!target) return; // 備份目標(biāo)頁面,防止在使用之前被清空 const backup = target; // 如果去往頁面是記憶節(jié)點,中斷函數(shù) if (~nodes.indexOf(to)) return; // 如果上次訪問不是記憶節(jié)點,中斷函數(shù) if (!~nodes.indexOf(previous)) return; // 清空目標(biāo)記錄 target = undefined; // 路由跳轉(zhuǎn),假定執(zhí)行函數(shù)為 navigate navigate(target); }代碼整合 ES5
var RouterMemory = function (nodes) { // 目標(biāo)頁面 this.target = undefined; // 上次訪問頁面 this.previous = undefined; // 記憶節(jié)點集合 this.nodes = nodes && nodes instanceof Array ? nodes : []; } /** * 記錄上次訪問及目標(biāo)頁面 * @param to {string} 去往頁面 */ RouterMemory.prototype.mark = function (to) { // 備份上次訪問頁面,防止被覆寫 var backup = this.previous; // 記錄上次訪問頁面 this.previous = to; // 如果上一個訪問頁面是記憶節(jié)點,中斷函數(shù) if (~nodes.indexOf(backup)) return; // 如果去往頁面不是記憶節(jié)點,中斷函數(shù) if (!~nodes.indexOf(to)) return; // 記錄目標(biāo)頁面 this.target = backup; } /** * 跳往目標(biāo)頁面 * @param to {string} 去往頁面 */ RouterMemory.prototype.check = function (to) { // 若目標(biāo)頁面不存在,中斷函數(shù) if (!this.target) return; // 備份目標(biāo)頁面,防止在使用之前被清空 const backup = this.target; // 如果去往頁面是記憶節(jié)點,中斷函數(shù) if (~nodes.indexOf(to)) return; // 如果上次訪問不是記憶節(jié)點,中斷函數(shù) if (!~nodes.indexOf(this.previous)) return; // 清空目標(biāo)頁面 this.target = undefined; // 路由跳轉(zhuǎn),假定執(zhí)行函數(shù)為 navigate navigate(this.target); }ES Next
class RouterMemory { constructor (nodes) { // 目標(biāo)頁面 this.target = undefined; // 上次訪問頁面 this.previous = undefined; // 記憶節(jié)點集合 this.nodes = nodes && nodes instanceof Array ? nodes : []; } /** * @param to {string} 去往頁面 */ mark (to) { // 備份上次訪問頁面,防止被覆寫 const backup = this.previous; // 記錄上次訪問頁面 this.previous = to; // 如果上一個訪問頁面是記憶節(jié)點,中斷函數(shù) if (nodes.includes(backup)) return; // 如果去往頁面不是記憶節(jié)點,中斷函數(shù) if (!nodes.includes(to)) return; // 記錄目標(biāo)頁面 this.target = backup; } /** * @param to {string} 去往頁面 */ check (to) { // 若目標(biāo)頁面不存在,中斷函數(shù) if (!this.target) return; // 備份目標(biāo)頁面,防止在使用之前被清空 const backup = this.target; // 如果去往頁面是記憶節(jié)點,中斷函數(shù) if (nodes.includes(to)) return; // 如果上次訪問不是記憶節(jié)點,中斷函數(shù) if (!nodes.includes(this.previous)) return; // 清空目標(biāo)記錄 this.target = undefined; // 路由跳轉(zhuǎn),假定執(zhí)行函數(shù)為 navigate navigate(this.target); } }
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/107108.html
摘要:配置方式找到文件如需添加路由則在里面添加,同時需要后端更改配置除了上面的路徑,其他路徑全部指向單頁應(yīng)用多路由預(yù)渲染指南使用說明源碼為方便快速構(gòu)建項目,本例所有配置的代碼均放在項目中。 寫在前面 每次構(gòu)建react項目的時候都會配置一大堆東西,時間久了就會忘記怎么配置。為了方便自己記憶也為了其他開發(fā)者在構(gòu)建react應(yīng)用時能夠快速開發(fā),故作此記錄。 本項目基于 create-react-...
摘要:的全稱是統(tǒng)一資源定位符英文,可以這么說,是一種標(biāo)準(zhǔn),而網(wǎng)址則是符合標(biāo)準(zhǔn)的一種實現(xiàn)而已。渲染器,將組件渲染到頁面上。 0x000 概述 從這一章開始就進(jìn)入路由章節(jié)了,并不直接從如何使用react-route來講,而是從路由的概念和實現(xiàn)來講,達(dá)到知道路由的本質(zhì),而不是只知道如何使用react-route庫的目的,畢竟react-route只是一個庫,是路由的一個實現(xiàn)而已,而不是路由本身。 ...
摘要:預(yù)渲染構(gòu)建階段生成匹配預(yù)渲染路徑的文件注意每個需要預(yù)渲染的路由都有一個對應(yīng)的。使用安裝中引入代碼打包目錄模板頁面要預(yù)渲染的頁面路由默認(rèn)掛在對象上,可以通過在預(yù)渲染頁面取值渲染時顯示瀏覽器窗口。 prerender-spa-plugin預(yù)渲染:構(gòu)建階段生成匹配預(yù)渲染路徑的 html 文件(注意:每個需要預(yù)渲染的路由都有一個對應(yīng)的html)。構(gòu)建出來的 html 文件已有部分內(nèi)容。 pre...
摘要:使用能優(yōu)雅的構(gòu)建并且與單頁面應(yīng)用程序完美結(jié)合。我們將重點關(guān)注所需的所有部分,然后在后續(xù)教程中,我們將進(jìn)一步演示如何使用作為層。例如,如果用戶刷新路由,我們將需要匹配該路由并返回應(yīng)用程序模板。運行應(yīng)用程序該基礎(chǔ)用于構(gòu)建具有和路由器的。 使用Laravel能優(yōu)雅的構(gòu)建API并且與Vue單頁面應(yīng)用程序(SPA)完美結(jié)合。在本教程中,我們將展示如何啟動和運行Vue路由器以及用于構(gòu)建SPA的La...
摘要:單頁面應(yīng)用的出現(xiàn)依然存在著爭議性,我們該如何看待他的兩面性呢接下來小生給大家總結(jié)一下他的優(yōu)缺點。單頁面應(yīng)用的優(yōu)勢無刷新體驗沒有了令人詬病的頁面頻繁刷新,同時節(jié)約瀏覽器資源,路由響應(yīng)比較及時,提升了用戶的體驗。 前端猿一天不學(xué)習(xí)就沒飯吃了,后端猿三天不學(xué)習(xí)仍舊有白米飯擺于桌前。IT行業(yè)的快速發(fā)展一直在推動著前端技術(shù)棧在不斷地更新?lián)Q代,前端的發(fā)展成了互聯(lián)網(wǎng)時代的一個縮影。而單頁面應(yīng)用的發(fā)展...
閱讀 1543·2021-09-22 15:35
閱讀 2020·2021-09-14 18:04
閱讀 896·2019-08-30 15:55
閱讀 2463·2019-08-30 15:53
閱讀 2693·2019-08-30 12:45
閱讀 1213·2019-08-29 17:01
閱讀 2594·2019-08-29 15:30
閱讀 3525·2019-08-29 15:09