前端路由的兩種模式:hash和history

隨著 ajax 的使用越來越廣泛,前端的頁面邏輯開始變得越來越復(fù)雜,特別是spa的興起,前端路由系統(tǒng)隨之開始流行。

1.從用戶的角度看,前端路由主要實(shí)現(xiàn)了兩個(gè)功能(使用ajax更新頁面狀態(tài)的情況下):

2.記錄當(dāng)前頁面的狀態(tài)(保存或分享當(dāng)前頁的url,再次打開該url時(shí),網(wǎng)頁還是保存(分享)時(shí)的狀態(tài));可以使用瀏覽器的前進(jìn)后退功能(如點(diǎn)擊后退按鈕,可以使頁面回到使用ajax更新頁面之前的狀態(tài),url也回到之前的狀態(tài));

作為開發(fā)者,要實(shí)現(xiàn)這兩個(gè)功能,我們需要做到:

1.改變url且不讓瀏覽器向服務(wù)器發(fā)出請求;

2.監(jiān)測 url 的變化;

3.截獲 url 地址,并解析出需要的信息來匹配路由規(guī)則。

我們路由常用hash模式和history模式實(shí)際上就是實(shí)現(xiàn)了上面的功能。

hash模式

hash是指url后的#以及后面的字符。這里的#和css中的#是一個(gè)意思。hash也稱作 錨點(diǎn)? 本身是用作做頁面定位的,它可以讓對應(yīng)id的元素顯示在可視區(qū)域內(nèi)。

window.location.hash = 'qq' // 設(shè)置 url 的 hash,會在當(dāng)前url后加上 '#qq'

? ? ? ? ? ? var hash = window.location.hash // '#qq'?

? ? ? ? ? ? window.addEventListener('hashchange', function(){?

? ? ? ? ? ? 監(jiān)聽hash變化,點(diǎn)擊瀏覽器的前進(jìn)后退會觸發(fā)

? ? })

history模式

已經(jīng)有 hash 模式了,而且 hash 能兼容到IE8, history 只能兼容到 IE10,為什么還要搞個(gè) history 呢?

首先,hash 本來是拿來做頁面定位的,如果拿來做路由的話,原來的錨點(diǎn)功能就不能用了。其次,hash 的傳參是基于 url 的,如果要傳遞復(fù)雜的數(shù)據(jù),會有體積的限制,而 history 模式不僅可以在url里放參數(shù),還可以將數(shù)據(jù)存放在一個(gè)特定的對象中。

window.history.pushState(state, title, url)?

state:需要保存的數(shù)據(jù),這個(gè)數(shù)據(jù)在觸發(fā)popstate事件時(shí),可以在event.state里獲取

?title:標(biāo)題,基本沒用,一般傳 null

url:設(shè)定新的歷史記錄的 url。新的 url 與當(dāng)前 url 的 origin 必須是一樣的,否則會拋出錯(cuò)誤。url可以是絕對路徑,也可以是相對路徑。

如?在百度頁面控制臺輸出:

window.history.pushState(null, null, "https://www.baidu.com/?name=history");

地址欄會變?yōu)椋篽ttps://www.baidu.com/?name=history

執(zhí)行history.pushState(null, null, './qq/'),則變成 https://www.baidu.com/qq/

上面的例子中 改變url頁面并沒有刷新,同樣根據(jù)API所述,瀏覽器會產(chǎn)生瀏覽記錄。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容