vue-router

參考鏈接:

http://www.reibang.com/p/4295aec31302

https://router.vuejs.org/zh/guide/

一、vue router 原理

vue-router通過 hashhistory interface 兩種方式實現(xiàn)前端路由,更新視圖但補充鋅請求頁面-是前端路由原理的核心之一凹炸,目前瀏覽器環(huán)境中這一功能的實現(xiàn)主要有兩種方式:

1秘案、hash --- 利用 URL 中的 hash(‘#’)

2夜郁、利用 History interface 在 HTML5 中新增的方法

在 vue-router中,它提供 mode 參數(shù)來決定采用哪一種方式吏祸,選擇流程如下:

mode參數(shù):

- 默認 hash

- histroy 注:如果瀏覽器不支持 history 新特性,則采用 hash 方式

- 如果不在瀏覽器環(huán)境則使用 abstract(node環(huán)境下)

mode

區(qū)別:

1钩蚊、mode:‘hash’贡翘,多了‘#’

http://localhost:8080/#/index

2蹈矮、mode:‘history’

http://localhost:8080/index

當(dāng)選擇 mode 類型之后,程序會根據(jù)你選擇的 mode 類型創(chuàng)建不同的 history 對象(HashHistory/HTML5History/AbstractHistory)

源碼

HashHistory

1床估、HashHistory.push():將新路由添加到瀏覽器訪問歷史的棧頂

push:入棧頂

從設(shè)置路由改變到視圖更新的流程:

$router.push() --> HashHistory.push() --> Histroy.transitionTo() --> History.updateRoute() --> {app._route=route} --> vm.render()

解析:

1 $router.push() //調(diào)用方法

2 HashHistory.push() //根據(jù)hash模式調(diào)用,設(shè)置hash并添加到瀏覽器歷史記錄(添加到棧頂)(window.location.hash= XXX)

3 History.transitionTo() //監(jiān)測更新含滴,更新則調(diào)用History.updateRoute()

4 History.updateRoute() //更新路由

5 {app._route= route} //替換當(dāng)前app路由

6 vm.render() //更新視圖

2、HashHistory.replace()

replace() 方法與 push() 方法不同之處在于丐巫,他并不是將新路由添加到瀏覽器訪問歷史的棧頂谈况,而是替換掉當(dāng)前的路由

replace:直接替換

replace (location: RawLocation, onComplete?: Function, onAbort?: Function) { this.transitionTo(location, route => { replaceHash(route.fullPath) onComplete && onComplete(route) }, onAbort)}

function replaceHash (path) { const i = window.location.href.indexOf('#') window.location.replace( window.location.href.slice(0, i >= 0 ? i : 0) + '#' + path )}

HTML5Histroy

History interface 是瀏覽器歷史記錄棧提供的接口,通過 back() forward() go() 等方法递胧,我們可以讀取瀏覽器歷史記錄棧的信息碑韵,進行各種跳轉(zhuǎn)操作。

從 HTML5 開始 History interface 有進一步更新:pashState() replaceState() 這下不僅是讀取了缎脾,還可以對瀏覽器歷史記錄棧進行更改:

window.history.pushState(stateObject, title, URL)

window.history.replaceState(stateObject, title, URL)

- stateObject:當(dāng)瀏覽器跳轉(zhuǎn)到新的狀態(tài)時祝闻,將觸發(fā) popState 時間,該事件將攜帶這個 stateObject 參數(shù)的副本

- title:所添加記錄的標(biāo)題

- URL:所添加記錄的url

1遗菠、push

與 hash 模式類似联喘,只是將 push 改為 history.pushState

2、replace

與 hash 模式類似辙纬,只是將window.replace改為history.replaceState

3豁遭、監(jiān)聽地址變化

在 HTML5History 的構(gòu)造函數(shù)中監(jiān)聽popState(window.onpopstate)

優(yōu)缺點:(推薦使用 history模式)

1、pushState() 設(shè)置的新 URL 可以是與當(dāng)前 URL 同源的任意 URL贺拣;而 hash 只可以修改 # 后面的部分蓖谢,故只可設(shè)置與當(dāng)前同文檔的URL

2、pushState() 通過 stateObject 可以添加任意類型的數(shù)據(jù)到記錄中譬涡;而 hash 只可以添加短字符串

3闪幽、pushState() 可以額外設(shè)置 title 屬性供后續(xù)使用

4、history 模式則會將 URL 修改的就像正常請求后端的 URL 一樣涡匀,如后端沒有配置對應(yīng) /user/id 的路由處理盯腌,則會返回404錯誤

二、

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末陨瘩,一起剝皮案震驚了整個濱河市腕够,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌拾酝,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件卡者,死亡現(xiàn)場離奇詭異蒿囤,居然都是意外死亡,警方通過查閱死者的電腦和手機崇决,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門材诽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來底挫,“玉大人,你說我怎么就攤上這事脸侥〗ǖ耍” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵睁枕,是天一觀的道長官边。 經(jīng)常有香客問我,道長外遇,這世上最難降的妖魔是什么注簿? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮跳仿,結(jié)果婚禮上诡渴,老公的妹妹穿的比我還像新娘。我一直安慰自己菲语,他們只是感情好妄辩,可當(dāng)我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著山上,像睡著了一般眼耀。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上胶哲,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天畔塔,我揣著相機與錄音,去河邊找鬼鸯屿。 笑死澈吨,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的寄摆。 我是一名探鬼主播谅辣,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼婶恼!你這毒婦竟也來了桑阶?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤勾邦,失蹤者是張志新(化名)和其女友劉穎蚣录,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體眷篇,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡萎河,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片虐杯。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡玛歌,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出擎椰,到底是詐尸還是另有隱情支子,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布达舒,位于F島的核電站值朋,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏休弃。R本人自食惡果不足惜吞歼,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望塔猾。 院中可真熱鬧篙骡,春花似錦、人聲如沸丈甸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽睦擂。三九已至得湘,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間顿仇,已是汗流浹背淘正。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留臼闻,地道東北人鸿吆。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像述呐,于是被迫代替她去往敵國和親惩淳。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容

  • 本文由淺入深觀摩vue-router源碼是如何通過hash與History interface兩種方式實現(xiàn)前端路由...
    world_7735閱讀 1,322評論 0 10
  • 介紹 vue-router是一個vue插件。其實質(zhì)是在location.hash进肯、location.replace...
    AmazRan閱讀 1,541評論 0 6
  • 隨著前端應(yīng)用的業(yè)務(wù)功能起來越復(fù)雜激蹲,用戶對于使用體驗的要求越來越高,單面(SPA)成為前端應(yīng)用的主流形式江掩。大型單頁應(yīng)...
    bayi_lzp閱讀 5,676評論 0 2
  • 窗外的綠色滿滿撞入我的眼睛学辱,柳絮隔著紗窗熱情的邀舞含蓉,可惜我不能出去。好了项郊,這些都是題外話。 一斟赚、實現(xiàn)原理 ps: ...
    青城墨闋閱讀 521評論 0 1
  • vue-router原理分析 單頁面應(yīng)用(SPA)的核心之一是: 更新視圖而不重新請求頁面, 實現(xiàn)這一點主要是兩種...
    鋒享前端閱讀 493評論 0 1