前端路由原理

???????本篇文章主要介紹前端路由相關(guān)的文章玻淑。在稍微復(fù)雜一點(diǎn)的SPA族壳,都需要路由孔庭,vue-router也是vue全家桶的標(biāo)配之一梳侨。vue-router中有hashH5 History兩種路由模式蛉威,下面,我們逐個(gè)進(jìn)行講解走哺。

一蚯嫌、網(wǎng)頁(yè)中url組成部分

網(wǎng)頁(yè)中url組成部分

二、hash模式

???????1丙躏、hash變化會(huì)觸發(fā)網(wǎng)頁(yè)跳轉(zhuǎn)择示,即瀏覽器的前進(jìn)、后退晒旅。
???????2栅盲、hash變化不會(huì)刷新頁(yè)面,SPA必需的特點(diǎn)
???????3敢朱、hash永遠(yuǎn)不會(huì)提交到server端(自生自滅)
???????在瀏覽器端剪菱,我們可以通過(guò)調(diào)用window.onhashchange方法來(lái)監(jiān)聽(tīng)頁(yè)面hash的變化摩瞎。下面的操作,都不會(huì)導(dǎo)致頁(yè)面hash值發(fā)生改變孝常,從而觸發(fā)window.onhashchange方法的執(zhí)行旗们。

a. js修改url
b. 手動(dòng)修改 url 的hash
c. 瀏覽器前進(jìn)、后退

具體請(qǐng)看下面代碼
1构灸、監(jiān)聽(tīng)hash改變

// hash 變化 包括
// a. js修改url
// b. 手動(dòng)修改 url 的hash
// c. 瀏覽器前進(jìn)上渴、后退
window.onhashchange = (event) => {
    console.log('old url', event.oldURL)
    console.log('new url', event.newURL)
    console.log('hash',location.hash)
}

2、頁(yè)面初次加載喜颁,獲取hash

// 頁(yè)面初次加載稠氮,獲取hash
document.addEventListener('DOMContentLoaded', () => {
     console.log('hash:', location.hash)
})

3、js修改hash

document.getElementById('btn1').addEventListener('click', function(){
     location.href="#/user"
})

4半开、手動(dòng)修改hash
???????此處不做演示隔披。

三、H5 history模式

???????1寂拆、用url規(guī)范的路由奢米,但是跳轉(zhuǎn)時(shí)不刷新頁(yè)面。
???????2纠永、history.pushState
???????3鬓长、history.onpopstate
???????正常頁(yè)面瀏覽是需要刷新頁(yè)面的,改造成H5 history模式后尝江,在首次加載后涉波,就不需要刷新頁(yè)面了。如下所示:

正常頁(yè)面瀏覽是需要刷新頁(yè)面的

改造成H5 history模式后炭序,在首次加載后啤覆,就不需要刷新頁(yè)面了

???????1、history.pushStatehistory.repalceState的使用
???????pushState說(shuō)明
???????pushState方法接受三個(gè)參數(shù)惭聂,依次為:state:一個(gè)與指定網(wǎng)址相關(guān)的狀態(tài)對(duì)象城侧,popstate事件觸發(fā)時(shí),該對(duì)象會(huì)傳入回調(diào)函數(shù)彼妻。如果不需要這個(gè)對(duì)象,此處可以填null豆茫。title:新頁(yè)面的標(biāo)題侨歉,但是所有瀏覽器目前都忽略這個(gè)值,因此這里可以填null揩魂。url:新的網(wǎng)址幽邓,必須與當(dāng)前頁(yè)面處在同一個(gè)域。瀏覽器的地址欄將顯示這個(gè)網(wǎng)址火脉。

???????最常用的方法:window.history.pushState(null,null,'download?id=1');完整使用:var oState= {title: '下載' };window.history.pushState(oState, '下載', 'download?id=1')

???????特點(diǎn):
???????pushState()可以創(chuàng)建歷史
???????可以配合popstate事件
???????可以使用history.go(-1)返回到上一個(gè)頁(yè)面牵舵。

window.addEventListener('popstate', function(evt){
  var state = evt.state;
  document.title= state.title; 
}, false);

replaceState說(shuō)明
???????window.history.replaceState(null,null,'download?id=1');完整使用:var oState= {title: '下載' };window.history.replaceState(oState, '下載', 'download?id=1');
???????特點(diǎn):
???????replaceState不會(huì)加入到歷史記錄里面柒啤,
???????用history.go(-1)會(huì)跳過(guò)當(dāng)前頁(yè)面相當(dāng)于是history.go(-2)。
具體請(qǐng)看下面代碼:

1畸颅、頁(yè)面初次加載担巩,獲取patch

document.addEventListener('DOMContentLoaded', () => {
   console.log('load', location.pathname)
})

2、打開(kāi)一個(gè)新路由

// 打開(kāi)一個(gè)新路由
// 【注意】用pushState方法没炒,瀏覽器不會(huì)刷新頁(yè)面
document.getElementById('btn1').addEventListener('click', function(){
    const state = {name: 'page1'}
    console.log('切換路由到', 'page1')
    history.pushState(state, 'page1', 'page1')
})

3涛癌、監(jiān)聽(tīng)瀏覽器前進(jìn)、后退

// 監(jiān)聽(tīng)瀏覽器前進(jìn)送火、后退
window.onpopstate = (event) => {
    console.log('onpopstate', event.state,location.pathname)
}

???????注意:H5 history模式一定要運(yùn)行在服務(wù)器模式下拳话。需要用http-server這樣的工具啟動(dòng)服務(wù)器。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末种吸,一起剝皮案震驚了整個(gè)濱河市弃衍,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌坚俗,老刑警劉巖镜盯,帶你破解...
    沈念sama閱讀 212,332評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異坦冠,居然都是意外死亡形耗,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,508評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)辙浑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)激涤,“玉大人,你說(shuō)我怎么就攤上這事判呕【胩撸” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,812評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵侠草,是天一觀的道長(zhǎng)辱挥。 經(jīng)常有香客問(wèn)我,道長(zhǎng)边涕,這世上最難降的妖魔是什么晤碘? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,607評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮功蜓,結(jié)果婚禮上园爷,老公的妹妹穿的比我還像新娘。我一直安慰自己式撼,他們只是感情好童社,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,728評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著著隆,像睡著了一般扰楼。 火紅的嫁衣襯著肌膚如雪呀癣。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,919評(píng)論 1 290
  • 那天弦赖,我揣著相機(jī)與錄音项栏,去河邊找鬼。 笑死腾节,一個(gè)胖子當(dāng)著我的面吹牛忘嫉,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播案腺,決...
    沈念sama閱讀 39,071評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼庆冕,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了劈榨?” 一聲冷哼從身側(cè)響起访递,我...
    開(kāi)封第一講書(shū)人閱讀 37,802評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎同辣,沒(méi)想到半個(gè)月后拷姿,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,256評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡旱函,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,576評(píng)論 2 327
  • 正文 我和宋清朗相戀三年响巢,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片棒妨。...
    茶點(diǎn)故事閱讀 38,712評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡踪古,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出券腔,到底是詐尸還是另有隱情伏穆,我是刑警寧澤,帶...
    沈念sama閱讀 34,389評(píng)論 4 332
  • 正文 年R本政府宣布纷纫,位于F島的核電站枕扫,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏辱魁。R本人自食惡果不足惜烟瞧,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,032評(píng)論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望染簇。 院中可真熱鬧燕刻,春花似錦、人聲如沸剖笙。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,798評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)弥咪。三九已至过蹂,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間聚至,已是汗流浹背酷勺。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,026評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留扳躬,地道東北人脆诉。 一個(gè)月前我還...
    沈念sama閱讀 46,473評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像贷币,于是被迫代替她去往敵國(guó)和親击胜。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,606評(píng)論 2 350