国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

SPA 路由記憶

starsfun / 2735人閱讀

摘要:路由記憶名詞解釋在中后臺(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

相關(guān)文章

  • react 項(xiàng)目構(gòu)建

    摘要:配置方式找到文件如需添加路由則在里面添加,同時(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-...

    ACb0y 評(píng)論0 收藏0
  • Router入門0x201: 從 URL 到 SPA

    摘要:的全稱是統(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)而已,而不是路由本身。 ...

    honmaple 評(píng)論0 收藏0
  • 前端prerender-spa-plugin預(yù)渲染

    摘要:預(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...

    godiscoder 評(píng)論0 收藏0
  • [譯]如何基于Laravel構(gòu)建Vue應(yīng)用(一)

    摘要:使用能優(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...

    Rocko 評(píng)論0 收藏0
  • SPA那點(diǎn)事

    摘要:?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ā)展...

    PumpkinDylan 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<