vue-router中history和hash兩種模式的區(qū)別的區(qū)別

說(shuō)到hash和history的區(qū)別博杖,最直觀的就是在url中闷营,hash帶了#,history沒(méi)有#漠吻,它們兩個(gè)是路由配置mode的兩個(gè)選項(xiàng)。

前端路由的核心是在改變視圖的同時(shí)不會(huì)向后端發(fā)出請(qǐng)求司恳,瀏覽器提供的這兩種支持就是為了達(dá)到這一目的途乃。


1.hash------就是指url中#號(hào)以及后面的字符

①hash也稱作錨點(diǎn),其中的#和css里面的#是一個(gè)意義扔傅,它本身是用來(lái)做頁(yè)面定位的耍共,可以是對(duì)應(yīng)的id元素顯示在可視區(qū)域內(nèi)烫饼。

②我們可以通過(guò)window.location.hash獲取hash值

③hash中有一個(gè)hashchange事件,當(dāng)hash值發(fā)生變化時(shí)會(huì)觸發(fā)這個(gè)事件试读,語(yǔ)法是:window.onhashchange=person? 或者? <body onhashchange='person'>,這個(gè)事件會(huì)覆蓋現(xiàn)有的事件處理程序杠纵,如果在想要添加一個(gè)新的事件處理程序的前提下,還不會(huì)覆蓋原有的事件處理程序钩骇,可以通過(guò)'addEventListener'

window.addEventLister('hashchange',person,false)

另外hashchange事件有兩個(gè)屬性:

newURL: string類(lèi)型比藻,當(dāng)前頁(yè)面新的url

oldURL: string類(lèi)型,當(dāng)前頁(yè)面舊的url

window.addEventListener('hashchange', function (e) { console.log(e.newURL,e.oldURL) })

④地址欄url中的#符號(hào)倘屹,比如:http://www.jd.com/#/a,hash...? ? 它的特點(diǎn)在于#/a雖然在url中银亲,但不會(huì)被包括在http請(qǐng)求中,對(duì)后端完全沒(méi)有影響唐瀑,因此改變hash并不會(huì)導(dǎo)致頁(yè)面的重新加載群凶。


2.history------它直接指向History對(duì)象,它表示當(dāng)前窗口的瀏覽歷史哄辣,History對(duì)象保存了當(dāng)前窗口訪問(wèn)過(guò)的所有頁(yè)面網(wǎng)址

①history.length屬性保存著歷史記錄的url數(shù)量请梢,初始值是 1,如果當(dāng)前窗口訪問(wèn)了四個(gè)網(wǎng)址力穗,那么history.length=4

?②可以在瀏覽器歷史之間移動(dòng)

go()接收一個(gè)整數(shù)為參數(shù)毅弧,移動(dòng)到該整數(shù)指定的頁(yè)面,比如history.go(1)相當(dāng)于history.forward(),history.go(-1)相當(dāng)于history.back(),history.go(0)相當(dāng)于刷新當(dāng)前頁(yè)面

back()移動(dòng)到上一個(gè)訪問(wèn)頁(yè)面当窗,等同于瀏覽器的后退鍵,常見(jiàn)的返回上一頁(yè)就可以用back()够坐,是從瀏覽器緩存中加載,而不是重新要求服務(wù)器發(fā)送新的網(wǎng)頁(yè)

forward()移動(dòng)到下一個(gè)訪問(wèn)頁(yè)面崖面,等同于瀏覽器的前進(jìn)鍵

③history.pushState()------在瀏覽器中添加歷史記錄元咙,這個(gè)方法不會(huì)觸發(fā)頁(yè)面刷新,只是導(dǎo)致了history對(duì)象發(fā)生變化巫员,地址欄會(huì)有反應(yīng)庶香。它有三個(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)址

如果pushState的url參數(shù)膳灶,設(shè)置了一個(gè)新的錨點(diǎn)值(即hash),并不會(huì)觸發(fā)hashChange事件立由,如果設(shè)置了一個(gè)跨域網(wǎng)址轧钓,則會(huì)報(bào)錯(cuò)司致。

④history.replaceState()------這個(gè)方法的參數(shù)和pushState()方法一摸一樣,區(qū)別是它修改瀏覽器歷史當(dāng)中的記錄

⑤history.state返回當(dāng)前頁(yè)面的state對(duì)象

⑥每當(dāng)同一個(gè)文檔的瀏覽歷史(即history)出現(xiàn)變化時(shí)聋迎,就會(huì)觸發(fā)popState事件

僅僅調(diào)用pushState方法或replaceState方法,并不會(huì)觸發(fā)該事件枣耀,只有用戶點(diǎn)擊瀏覽器后退和前進(jìn)按鈕時(shí)霉晕,或者使用js調(diào)用back、forward捞奕、go方法時(shí)才會(huì)觸發(fā)牺堰。另外該事件只針對(duì)同一個(gè)文檔,如果瀏覽歷史的切換颅围,導(dǎo)致加載不同的文檔伟葫,該事件不會(huì)被觸發(fā)

使用的時(shí)候,可以為popState事件指定回調(diào)函數(shù)院促,回調(diào)函數(shù)的參數(shù)是一個(gè)event事件對(duì)象筏养,它的state屬性指向pushState和replaceState方法為當(dāng)前url所提供的狀態(tài)對(duì)象(即這兩個(gè)方法的第一個(gè)參數(shù))。

⑦h(yuǎn)istory.scrollRestoration = 'manual';關(guān)閉瀏覽器自動(dòng)滾動(dòng)行為

history.scrollRestoration = 'auto';打開(kāi)瀏覽器自動(dòng)滾動(dòng)行為(默認(rèn))


一般場(chǎng)景下常拓,hash和history都可以使用

history

①優(yōu)點(diǎn):如果你更在意顏值渐溶,那么就使用沒(méi)有#的history模式,這種模式充分利用history.pushState? API來(lái)完成url的跳轉(zhuǎn)弄抬,而且不需要重新加載頁(yè)面茎辐,通過(guò)pushState()設(shè)置的url可以是和當(dāng)前url同源的任意url,甚至可以與當(dāng)前url一模一樣,它通過(guò)stateObject參數(shù)可以添加任意類(lèi)型的數(shù)據(jù)到記錄中掂恕,它還可以額外設(shè)置title屬性拖陆,提供給后續(xù)使用。利用pushState和replaceState方法懊亡,對(duì)歷史記錄進(jìn)行修改

缺點(diǎn):就是如果通過(guò)url向后端發(fā)起請(qǐng)求時(shí)依啰,尤其是在用戶手動(dòng)輸入url回車(chē)或者重新刷新(重啟)瀏覽器的時(shí)候,會(huì)報(bào)404錯(cuò)誤斋配,找不到指定路由孔飒,需要后端去指向正確的路由匹配, 比如當(dāng)url不匹配時(shí)跳轉(zhuǎn)到index.html,雖然通過(guò)以上兩種方法改變了當(dāng)前的url艰争,但是瀏覽器不會(huì)立即向后端發(fā)送請(qǐng)求

hash

②優(yōu)點(diǎn):回車(chē)刷新可以加載到hash值對(duì)應(yīng)的頁(yè)面坏瞄,并且支持低版本瀏覽器和IE瀏覽器,#/a雖然在url中甩卓,但不會(huì)被包括在http請(qǐng)求中鸠匀,對(duì)后端完全沒(méi)有影響,因此改變hash不會(huì)重新加載頁(yè)面逾柿。

缺點(diǎn):hash設(shè)置的新值必須與原來(lái)的不一樣才會(huì)出發(fā)動(dòng)作并且將記錄添加到棧中缀棍,它只可以修改#后面的部分宅此,所以只能設(shè)置與當(dāng)前url同文檔的url,只有短字符串才可以添加到記錄中

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末爬范,一起剝皮案震驚了整個(gè)濱河市父腕,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌青瀑,老刑警劉巖璧亮,帶你破解...
    沈念sama閱讀 211,561評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異斥难,居然都是意外死亡枝嘶,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)哑诊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)群扶,“玉大人,你說(shuō)我怎么就攤上這事镀裤【翰” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,162評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵淹禾,是天一觀的道長(zhǎng)馁菜。 經(jīng)常有香客問(wèn)我,道長(zhǎng)铃岔,這世上最難降的妖魔是什么汪疮? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,470評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮毁习,結(jié)果婚禮上智嚷,老公的妹妹穿的比我還像新娘。我一直安慰自己纺且,他們只是感情好盏道,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,550評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著载碌,像睡著了一般猜嘱。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上嫁艇,一...
    開(kāi)封第一講書(shū)人閱讀 49,806評(píng)論 1 290
  • 那天朗伶,我揣著相機(jī)與錄音,去河邊找鬼步咪。 笑死论皆,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播点晴,決...
    沈念sama閱讀 38,951評(píng)論 3 407
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼感凤,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了粒督?” 一聲冷哼從身側(cè)響起陪竿,我...
    開(kāi)封第一講書(shū)人閱讀 37,712評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎屠橄,沒(méi)想到半個(gè)月后萨惑,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,166評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡仇矾,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,510評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了解总。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片贮匕。...
    茶點(diǎn)故事閱讀 38,643評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖花枫,靈堂內(nèi)的尸體忽然破棺而出刻盐,到底是詐尸還是另有隱情,我是刑警寧澤劳翰,帶...
    沈念sama閱讀 34,306評(píng)論 4 330
  • 正文 年R本政府宣布敦锌,位于F島的核電站,受9級(jí)特大地震影響佳簸,放射性物質(zhì)發(fā)生泄漏乙墙。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,930評(píng)論 3 313
  • 文/蒙蒙 一生均、第九天 我趴在偏房一處隱蔽的房頂上張望听想。 院中可真熱鬧,春花似錦马胧、人聲如沸汉买。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,745評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)蛙粘。三九已至,卻和暖如春威彰,著一層夾襖步出監(jiān)牢的瞬間出牧,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,983評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工抱冷, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留崔列,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,351評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像赵讯,于是被迫代替她去往敵國(guó)和親盈咳。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,509評(píng)論 2 348

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