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