關(guān)于前端路由實(shí)現(xiàn)的原理
重點(diǎn)說其中的兩個(gè)新增的API history.pushState 和 history.replaceState
這兩個(gè) API 都接收三個(gè)參數(shù),分別是:
狀態(tài)對(duì)象(state object) — 一個(gè)JavaScript對(duì)象,與用pushState()方法創(chuàng)建的新歷史記錄條目關(guān)聯(lián)饥瓷。無論何時(shí)用戶導(dǎo)航到新創(chuàng)建的狀態(tài)往枣,popstate事件都會(huì)被觸發(fā),并且事件對(duì)象的state屬性都包含歷史記錄條目的狀態(tài)對(duì)象的拷貝望迎。
標(biāo)題(title) — FireFox瀏覽器目前會(huì)忽略該參數(shù),雖然以后可能會(huì)用上「灞冢考慮到未來可能會(huì)對(duì)該方法進(jìn)行修改,傳一個(gè)空字符串會(huì)比較安全歉备「凳牵或者,你也可以傳入一個(gè)簡(jiǎn)短的標(biāo)題蕾羊,標(biāo)明將要進(jìn)入的狀態(tài)喧笔。
地址(URL) — 新的歷史記錄條目的地址。瀏覽器不會(huì)在調(diào)用pushState()方法后加載該地址龟再,但之后书闸,可能會(huì)試圖加載,例如用戶重啟瀏覽器利凑。新的URL不一定是絕對(duì)路徑浆劲;如果是相對(duì)路徑,它將以當(dāng)前URL為基準(zhǔn)哀澈;傳入的URL與當(dāng)前URL應(yīng)該是同源的牌借,否則,pushState()會(huì)拋出異常割按。該參數(shù)是可選的膨报;不指定的話則為文檔當(dāng)前URL。
相同之處是兩個(gè) API 都會(huì)操作瀏覽器的歷史記錄,而不會(huì)引起頁面的刷新现柠。
不同之處在于院领,pushState會(huì)增加一條新的歷史記錄,而replaceState則會(huì)替換當(dāng)前的歷史記錄晒旅。