從構(gòu)建vue項(xiàng)目開(kāi)始矛渴,來(lái)分析vue項(xiàng)目中的細(xì)節(jié)以及知識(shí)點(diǎn): 1.前端路由

從代碼分析,從頭構(gòu)建一個(gè)vue項(xiàng)目需要理解vue的各個(gè)知識(shí)點(diǎn)惫搏。

當(dāng)你使用npm創(chuàng)建一個(gè)vue項(xiàng)目之后具温,首先接觸的就是app.vue。該文件的內(nèi)容也很簡(jiǎn)單晶府,最開(kāi)始就是如下:

最基礎(chǔ)的app項(xiàng)目app文件

從這里就可以看到<router-view/>

而這個(gè)就是大名鼎鼎的前端路由桂躏,可以知道,凡是整個(gè)項(xiàng)目都是DOM直出的頁(yè)面川陆,我們都稱它為“傳統(tǒng)頁(yè)面”(SSR 屬于首屏直出剂习,這里我不認(rèn)為是傳統(tǒng)頁(yè)面的范疇)。那么什么是DOM直出呢较沪?

簡(jiǎn)單說(shuō)就是在瀏覽器輸入網(wǎng)址后發(fā)起請(qǐng)求鳞绕,返回來(lái)的HTML頁(yè)面是最終呈現(xiàn)的效果尸曼,那就是DOM直出。并且每次點(diǎn)擊頁(yè)面跳轉(zhuǎn)冤竹,都會(huì)重新請(qǐng)求HTML資源鹦蠕。

說(shuō)的更簡(jiǎn)單一點(diǎn)就是你去查看一些網(wǎng)頁(yè)開(kāi)發(fā)者模式钟病,查看以下network請(qǐng)求返回的的資源 如果是頁(yè)面資源除了css跟script文件以外 全部都有刚梭,那么就是傳統(tǒng)的DOM直出朴读。

而隨著對(duì)網(wǎng)頁(yè)需求的不斷增高,網(wǎng)頁(yè)也越來(lái)越傾向轉(zhuǎn)為模塊化缘回、組件化的道路。而順勢(shì)而生的React啦吧、?Vue拙寡、?Angular?等著名單頁(yè)面應(yīng)用框架肆糕。而這些框架有一個(gè)共同的特點(diǎn),便是“通過(guò) JS 渲染頁(yè)面”淮摔。

這些單頁(yè)面框架之后和橙,?HTML頁(yè)面基本上只有一個(gè)?DOM?入口造垛,大致如下所示:


vue項(xiàng)目瀏覽器檢查源代碼

所有的頁(yè)面組件办斑,都是通過(guò)運(yùn)行上圖底部的?app.js腳本杆逗,掛載到?<div id="root"></div>?這個(gè)節(jié)點(diǎn)下面罪郊。用一個(gè)極其簡(jiǎn)單的 JS 展示掛載這一個(gè)步驟:


JS掛載

既然單頁(yè)面是這樣渲染的排龄,那如果我有十幾個(gè)頁(yè)面要互相跳轉(zhuǎn)切換橄维,咋整U琛3鹤啤店溢?床牧?這時(shí)候?前端路由?應(yīng)運(yùn)而生戈咳,它的出現(xiàn)就是為了解決單頁(yè)面網(wǎng)站著蛙,通過(guò)切換瀏覽器地址路徑耳贬,來(lái)匹配相對(duì)應(yīng)的頁(yè)面組件咒劲。

簡(jiǎn)單來(lái)說(shuō)下邏輯就是:

http://192.168.12.216:8080/#/中國(guó)---->定位到? /中國(guó) ----->跳轉(zhuǎn)到中國(guó)這個(gè)組件

http://192.168.12.216:8080/#/美國(guó)---->定位到? /美國(guó)----->跳轉(zhuǎn)到美國(guó)?這個(gè)組件

前端路由?會(huì)根據(jù)瀏覽器地址欄 pathname?的變化缎患,去匹配相應(yīng)的頁(yè)面組件挤渔。然后將其通過(guò)創(chuàng)建 DOM?節(jié)點(diǎn)的形式,塞入根節(jié)點(diǎn) <div id="root"></div>?嫉父。這就達(dá)到了無(wú)刷新頁(yè)面切換的效果眼刃,從側(cè)面也能說(shuō)明正因?yàn)闊o(wú)刷新擂红,所以 React?、 Vue?树碱、 Angular?等現(xiàn)代框架在創(chuàng)建頁(yè)面組件的時(shí)候成榜,每個(gè)組件都有自己的 生命周期?赎婚。

這里終于說(shuō)到我們的Vue-Router

為了讓大家對(duì)前端路由的原理有一個(gè)更深刻的理解,我們來(lái)通過(guò)分析哈希模式和歷史模式的實(shí)現(xiàn)原理來(lái)幫助大家明白前端路由是怎么實(shí)現(xiàn)的纬凤。

哈希模式

a標(biāo)簽錨點(diǎn)大家應(yīng)該不陌生移斩,而瀏覽器地址上#后面的變化绢馍,是可以被監(jiān)聽(tīng)的舰涌,瀏覽器為我們提供了原生監(jiān)聽(tīng)事件hashchange瓷耙,它可以監(jiān)聽(tīng)到如下的變化:

點(diǎn)擊a標(biāo)簽搁痛,改變了瀏覽器地址

瀏覽器的前進(jìn)后退行為

通過(guò)window.location方法鸡典,改變?yōu)g覽器地址


navbar.vue


app.vue


路由index.js


效果圖

歷史模式

history?模式會(huì)比?hash模式稍麻煩一些,因?yàn)?history模式依賴的是原生事件?popstate纽甘,下面是來(lái)自 MDN 的解釋:

需要注意的是調(diào)用history.pushState()/history.replaceState()不會(huì)觸發(fā)popstate事件悍赢。只有在做出瀏覽器動(dòng)作時(shí),才會(huì)觸發(fā)該事件皮胡,如用戶點(diǎn)擊瀏覽器的回退按鈕(javaScript代碼中調(diào)用history.back()/history.forward())

tips:pushState 和 replaceState 都是 HTML5 的新 API,他們的作用很強(qiáng)大瀑梗,可以做到改變?yōu)g覽器地址卻不刷新頁(yè)面。這是實(shí)現(xiàn)改變地址欄卻不刷新頁(yè)面的重要方法谤职。

因?yàn)閍標(biāo)簽點(diǎn)擊事件并不受到popState監(jiān)聽(tīng)亿鲜,所以我們必須想方法組織a標(biāo)簽的默認(rèn)事件蒿柳,加上點(diǎn)擊事件的回調(diào)函數(shù),在回調(diào)函數(shù)內(nèi)獲取?a?標(biāo)簽的?href屬性值妓蛮,再通過(guò)?pushState?去改變?yōu)g覽器的?location.pathname?屬性值蛤克。然后手動(dòng)執(zhí)行?popstate?事件的回調(diào)函數(shù)构挤,去匹配相應(yīng)的路由惕鼓。

以上這段沒(méi)理解也沒(méi)事夫否,因?yàn)楹竺鏁?huì)針對(duì)vue項(xiàng)目中如何絲滑的使用路由進(jìn)行詳解凰慈。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市驼鹅,隨后出現(xiàn)的幾起案子微谓,更是在濱河造成了極大的恐慌,老刑警劉巖输钩,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件豺型,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡买乃,警方通過(guò)查閱死者的電腦和手機(jī)姻氨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)剪验,“玉大人肴焊,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我熊痴,道長(zhǎng)巾陕,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任薪寓,我火速辦了婚禮恶守,結(jié)果婚禮上植锉,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布棉钧。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上兽掰,一...
    開(kāi)封第一講書人閱讀 52,441評(píng)論 1 310
  • 那天泻云,我揣著相機(jī)與錄音婆瓜,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播漱病,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼当凡,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼冤荆!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤庞萍,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后重虑,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體提针,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡嗜价,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年久锥,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片痴施。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡宵蕉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出丽啡,到底是詐尸還是另有隱情谋右,我是刑警寧澤,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布补箍,位于F島的核電站改执,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏坑雅。R本人自食惡果不足惜天梧,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望霞丧。 院中可真熱鬧呢岗,春花似錦、人聲如沸蛹尝。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)突那。三九已至挫酿,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間愕难,已是汗流浹背早龟。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工惫霸, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人葱弟。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓壹店,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親芝加。 傳聞我的和親對(duì)象是個(gè)殘疾皇子硅卢,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359

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