前言
vue-router是什么:是vue.js官方的路由管理器和vue.js的核心深度的集成耿焊,讓開發(fā)者更加簡(jiǎn)單的構(gòu)建單頁面應(yīng)用烛谊。
vue-router的功能是什么:嵌套的路由/視圖表
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 模塊化的勘究、基于組件的路由配置
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 路由參數(shù)蚕愤、查詢凡橱、通配符
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 基于vue.js過渡系統(tǒng)的視圖過渡效果
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 細(xì)粒度的導(dǎo)航控制(控制的很精細(xì)的意思慰枕,對(duì)很多細(xì)節(jié)也進(jìn)行控制)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 帶有自動(dòng)激活的 css class?鏈接
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?HTML5歷史模式或hash模式呛踊,在IE中自動(dòng)降級(jí)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?自定義滾動(dòng)條行為
基礎(chǔ)
vue-router構(gòu)建單頁面應(yīng)用砾淌,只需要將組件映射到路由,熱后告訴vue-router在哪里渲染它們
簡(jiǎn)單的例子:
使用vue-router有幾個(gè)方法
直接利用import引入router.js文件谭网,在文件中寫組件的路由
利用編程式的導(dǎo)航
動(dòng)態(tài)路由的匹配
有時(shí)候我們需要把某種模式匹配到的所有路由汪厨,全都映射到同個(gè)組件時(shí),我們就會(huì)用到動(dòng)態(tài)路由的匹配愉择,路徑參數(shù)使用:標(biāo)記當(dāng)匹配到一個(gè)路由時(shí)劫乱,參數(shù)值會(huì)被設(shè)置到?this.$route.params,可以在每個(gè)組件內(nèi)使用锥涕。
響應(yīng)路由參數(shù)的變化
當(dāng)使用路由參數(shù)時(shí)衷戈,原來的組件實(shí)例會(huì)被復(fù)用。因?yàn)閮蓚€(gè)路由都渲染同個(gè)組件层坠,比起銷毀再創(chuàng)建殖妇,復(fù)用則顯得更加高效,生命鉤子不被再次調(diào)用破花。復(fù)用組件時(shí)谦趣,想對(duì)路由參數(shù)的變化作出響應(yīng)的話疲吸,可以用以下兩種方式
因?yàn)閙ounted ,created不會(huì)再調(diào)用?,?可以這兩種方式監(jiān)聽參數(shù)變化蔚润,做相應(yīng)的業(yè)務(wù)邏輯處理磅氨。
匹配優(yōu)先級(jí)
匹配的優(yōu)先級(jí)就按照路由的定義順序:誰先定義的,誰的優(yōu)先級(jí)就最高嫡纠。
嵌套路由
要在嵌套的出口中渲染組件烦租,需要在VueRouter的參數(shù)中使用children配置
注意:以/開頭的嵌套路徑會(huì)當(dāng)作根路徑,充分使用嵌套組件而無須設(shè)置嵌套路徑除盏,children?配置就是像?routes?配置一樣的路由配置數(shù)組叉橱,所以呢,你可以嵌套多層路由者蠕。
編程式導(dǎo)航
this.$router.push(location,onComplete?,onAbort?)
除了使用??創(chuàng)建 a 標(biāo)簽來定義導(dǎo)航鏈接窃祝,我們還可以借助 router 的實(shí)例方法,通過編程式導(dǎo)航來實(shí)現(xiàn):?this.$router.push({path:' '}} 踱侣。
這方法會(huì)向history棧添加一個(gè)新的記錄粪小,所以,當(dāng)用戶點(diǎn)擊瀏覽器后退按鈕時(shí)抡句,則回到之前的地址
使用了path探膊,params會(huì)被忽略,同樣的規(guī)則也適用于?router-link?組件的?to?屬性待榔。
this.$router.replace (location,onComplete?,onAbort?)
和router.push很像唯一的不同是逞壁,它不會(huì)向history添加新紀(jì)錄,而是替換當(dāng)前的history記錄
聲明式:<router-link :to="..."? replace>
編程式:router.replace(...)
router go(n)
n為整數(shù)锐锣,意思是在history記錄中向前或后退多少步腌闯,類似window.history.go(n)
命名路由
有時(shí),在通過名稱來進(jìn)行頁面路由跳轉(zhuǎn)會(huì)方便很多雕憔,可以在創(chuàng)建實(shí)例的時(shí)候給路由設(shè)置名稱
使用方法:
命名視圖
有時(shí)候想要同時(shí)(同級(jí))展示多個(gè)視圖姿骏,而不是嵌套展示,這時(shí)候就可以使用命名視圖的方法,命名視圖首先需要在路由配置上命名組件是名字,使用<router-view?name=" "></router-view>來實(shí)現(xiàn)又碌。
嵌套命名路由
重定向和別名
重定向(redirect)
別名(alias)
/a?的別名是?/b,則當(dāng)用戶訪問?/b?時(shí)擅腰,URL 會(huì)保持為?/b蟋恬,但是路由匹配為?/a翁潘,就像用戶訪問?/a?一樣。
“別名”的功能讓你可以自由地將 UI 結(jié)構(gòu)映射到任意的 URL歼争,不會(huì)受限于配置的嵌套路由結(jié)構(gòu)拜马。
路由組件傳參
使用$router會(huì)使其于路由高度耦合渗勘,從而使組件只能在特定的 URL 上使用
可以使用props對(duì)其組件和路由進(jìn)行解耦
布爾模式
如果?props?被設(shè)置為?true,route.params?將會(huì)被設(shè)置為組件屬性俩莽。
對(duì)象模式
props?是一個(gè)對(duì)象旺坠,它會(huì)被按原樣設(shè)置為組件屬性,當(dāng)?props?是靜態(tài)的時(shí)候有用扮超。
函數(shù)模式
你可以創(chuàng)建一個(gè)函數(shù)返回?props取刃。這樣你便可以將參數(shù)轉(zhuǎn)換成另一種類型,將靜態(tài)值與基于路由的值結(jié)合等出刷。盡可能保持?props?函數(shù)為無狀態(tài)璧疗,因?yàn)樗粫?huì)在路由發(fā)生變化時(shí)起作用。
HTML5 History 模式
vue-router?默認(rèn)使用 hash 模式馁龟,使用 URL 的 hash 來模擬一個(gè)完整的 URL崩侠,當(dāng) URL 改變時(shí),頁面不會(huì)重新加載坷檩。使用history模式時(shí)url會(huì)好看些(如:http://?dayou.com/user/id)却音,完成 URL 跳轉(zhuǎn)而無須重新加載頁面。這種模式需要后臺(tái)配置支持矢炼,因?yàn)槲覀兊膽?yīng)用是個(gè)單頁客戶端應(yīng)用系瓢,如果后臺(tái)沒有正確的配置,當(dāng)用戶在瀏覽器直接訪問?http://oursite.com/user/id?就會(huì)返回 404裸删。服務(wù)端需要增加一個(gè)覆蓋所有情況的候選資源八拱,如果 URL 匹配不到任何靜態(tài)資源,則應(yīng)該返回同一個(gè)?index.html?頁面涯塔。
進(jìn)階
導(dǎo)航守衛(wèi)
vue-router?提供的導(dǎo)航守衛(wèi)主要用來通過跳轉(zhuǎn)或取消的方式守衛(wèi)導(dǎo)航肌稻,參數(shù)或查詢的改變并不會(huì)觸發(fā)進(jìn)入/離開的導(dǎo)航守衛(wèi)∝拜可以觀察$router對(duì)象來應(yīng)對(duì)這些變化用?beforeRouteUpdate?的組件內(nèi)守衛(wèi)爹谭,進(jìn)入路由前先通過守衛(wèi),來判斷是否可以通過榛搔,進(jìn)而到達(dá)頁面诺凡。
全局守衛(wèi)
使用?router.beforeEach?注冊(cè)一個(gè)全局前置守衛(wèi),在定義router的地方定義
一個(gè)導(dǎo)航觸發(fā)時(shí)践惑,全局前置守衛(wèi)按照創(chuàng)建順序調(diào)用腹泌。守衛(wèi)是異步解析執(zhí)行,此時(shí)導(dǎo)航在所有守衛(wèi) resolve(解決) 完之前一直處于等待的狀態(tài)尔觉。
to: Route: 即將要進(jìn)入的目標(biāo)?路由對(duì)象
from: Route: 當(dāng)前導(dǎo)航正要離開的路由
next: Function: 一定要調(diào)用該方法來?resolve?這個(gè)鉤子凉袱。執(zhí)行效果依賴?next?方法的調(diào)用參數(shù)。
next(): 進(jìn)行管道中的下一個(gè)鉤子。如果全部鉤子執(zhí)行完了专甩,則導(dǎo)航的狀態(tài)就是?confirmed?(確認(rèn)的)钟鸵。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
next(false): 中斷當(dāng)前的導(dǎo)航。如果瀏覽器的 URL 改變了 (可能是用戶手動(dòng)或者瀏覽器后退按鈕)涤躲,那么 URL 地址會(huì)重置到?from?路由對(duì)應(yīng)的地址棺耍。
next('/')?或者?next({ path: '/' }): 跳轉(zhuǎn)到一個(gè)不同的地址。當(dāng)前的導(dǎo)航被中斷种樱,然后進(jìn)行一個(gè)新的導(dǎo)航蒙袍。你可以向?next?傳遞任意位置對(duì)象,且允許設(shè)置諸如?replace: true嫩挤、name: 'home'之類的選項(xiàng)以及任何用在?router-link?的?to?prop?或?router.push?中的選項(xiàng)左敌。
next(error): (2.4.0+) 如果傳入?next?的參數(shù)是一個(gè)?Error?實(shí)例,則導(dǎo)航會(huì)被終止且該錯(cuò)誤會(huì)被傳遞給?router.onError()?注冊(cè)過的回調(diào)俐镐。?
確保要調(diào)用?next?方法矫限,否則鉤子就不會(huì)被 resolved。
全局解析守衛(wèi)( router.beforeResolve )
和全局守衛(wèi)區(qū)別是在導(dǎo)航被確認(rèn)之前佩抹,同時(shí)在所有組件內(nèi)守衛(wèi)和異步路由組件被解析之后叼风,解析守衛(wèi)就被調(diào)用。
全局后置鉤子
全局后置鉤子不接受next函數(shù)也不會(huì)改變導(dǎo)航本身
路由獨(dú)享守衛(wèi)
在路由配置上直接定義?beforeEnter?守衛(wèi)
組件內(nèi)的守衛(wèi)
路由組件內(nèi)直接定義路由導(dǎo)航守衛(wèi):beforeRouteEnter棍苹,beforeRouteUpdate无宿,beforeRouteLeave
beforeRouteEnter( )不能獲取組件實(shí)例this,不過可以通過傳一個(gè)回調(diào)給?next來訪問組件實(shí)例枢里。在導(dǎo)航被確認(rèn)的時(shí)候執(zhí)行回調(diào)孽鸡,并且把組件實(shí)例作為回調(diào)方法的參數(shù)。
beforeRouteEnter?是支持next傳遞回調(diào)的唯一守衛(wèi)栏豺。
對(duì)于?beforeRouteUpdate?和?beforeRouteLeave?來說彬碱,this?已經(jīng)可用了,所以不支持傳遞回調(diào)
離開守衛(wèi)通常用來禁止用戶在還未保存修改前突然離開奥洼。該導(dǎo)航可以通過?next(false)?來取消
完整的導(dǎo)航解析流程
1巷疼、導(dǎo)航被觸發(fā)。
2灵奖、在失活的組件里調(diào)用離開守衛(wèi)嚼沿。
3、調(diào)用全局的?beforeEach?守衛(wèi)瓷患。
4骡尽、在重用的組件里調(diào)用?beforeRouteUpdate?守衛(wèi) (2.2+)。
5擅编、在路由配置里調(diào)用?beforeEnter攀细。
6、解析異步路由組件。
7辨图、在被激活的組件里調(diào)用?beforeRouteEnter。
8肢藐、調(diào)用全局的?beforeResolve?守衛(wèi) (2.5+)故河。
9、導(dǎo)航被確認(rèn)吆豹。
10鱼的、調(diào)用全局的?afterEach?鉤子。
11痘煤、觸發(fā) DOM 更新凑阶。
12、用創(chuàng)建好的實(shí)例調(diào)用?beforeRouteEnter?守衛(wèi)中傳給?next?的回調(diào)函數(shù)衷快。
路由元信息
定義路由的時(shí)可配置?meta?字段:
我們稱呼?routes?配置中的每個(gè)路由對(duì)象為?路由記錄宙橱。路由記錄可以是嵌套的,因此蘸拔,當(dāng)一個(gè)路由匹配成功后师郑,可能匹配多個(gè)路由記錄
那么如何訪問這個(gè)?meta?字段呢
要確保最后使用了next( )
過渡效果
?是基本的動(dòng)態(tài)組件,我們可以用組件給它添加過渡效果
單個(gè)路由的過渡效果
如果只想讓部分路由有過渡效果或者想路由的效果不同可在各路由組件內(nèi)使用<transition>并且設(shè)置不同的name值
基于路由的動(dòng)態(tài)過渡效果
基于當(dāng)前路由與目標(biāo)路由的變化關(guān)系调窍,動(dòng)態(tài)設(shè)置過渡效果
數(shù)據(jù)獲取
我們經(jīng)常需要在頁面加載的時(shí)候獲取對(duì)應(yīng)的數(shù)據(jù)宝冕,我們可以通過以下的兩種方式進(jìn)行:
導(dǎo)航完成之后獲取:先完成導(dǎo)航邓萨,然后在接下來的組件生命周期鉤子中獲取數(shù)據(jù)地梨。在數(shù)據(jù)獲取期間顯示“加載中”之類的指示。
導(dǎo)航完成之前獲鹊蘅摇:導(dǎo)航完成前宝剖,在路由進(jìn)入的守衛(wèi)中獲取數(shù)據(jù),在數(shù)據(jù)獲取成功后執(zhí)行導(dǎo)航歉甚。
導(dǎo)航完成之后獲取
當(dāng)你使用這種方式時(shí)诈闺,我們會(huì)馬上導(dǎo)航和渲染組件,然后在組件的?created?鉤子中獲取數(shù)據(jù)铃芦。這讓我們有機(jī)會(huì)在數(shù)據(jù)獲取期間展示一個(gè) loading 狀態(tài)雅镊,還可以在不同視圖間展示不同的 loading 狀態(tài)。
導(dǎo)航完成之前獲取
這種方式我們?cè)趯?dǎo)航轉(zhuǎn)入新的路由前獲取數(shù)據(jù)刃滓。我們可以在接下來的組件的?beforeRouteEnter?守衛(wèi)中獲取數(shù)據(jù)仁烹,當(dāng)數(shù)據(jù)獲取成功后只調(diào)用?next?方法。
滾動(dòng)行為
當(dāng)切換到新路由時(shí)咧虎,想要頁面滾到頂部卓缰,或是保持原先的滾動(dòng)位置,就像重新加載頁面那樣。
當(dāng)創(chuàng)建一個(gè) Router 實(shí)例征唬,你可以提供一個(gè)?scrollBehavior?方法:
異步滾動(dòng)
如果在不知道要滾動(dòng)到那個(gè)具體位置捌显,則可以使用異步滾動(dòng),獲取后臺(tái)要滾動(dòng)到的具體位置总寒,返回一個(gè) Promise 來得出預(yù)期的位置描述:
將其掛載到從頁面級(jí)別的過渡組件的事件上扶歪,令其滾動(dòng)行為和頁面過渡一起良好運(yùn)行是可能的
路由懶加載
當(dāng)打包構(gòu)建應(yīng)用時(shí),Javascript 包會(huì)變得非常大摄闸,影響頁面加載善镰。
所以我們把不同路由對(duì)應(yīng)的組件分割成不同的代碼塊,然后當(dāng)路由被訪問的時(shí)候才加載對(duì)應(yīng)組件年枕,這樣就更加高效了炫欺。
結(jié)合 Vue 的異步組件和 Webpack 的代碼分割功能,輕松實(shí)現(xiàn)路由組件的懶加載熏兄。
首先品洛,可以將異步組件定義為返回一個(gè) Promise 的工廠函數(shù) (該函數(shù)返回的 Promise 應(yīng)該 resolve 組件本身):
const Foo = () => Promise.resolve({ /* 組件定義對(duì)象 */ })
第二,在 Webpack 2 中摩桶,我們可以使用動(dòng)態(tài) import語法來定義代碼分塊點(diǎn) (split point):
import('./Foo.vue') // 返回 Promise
定義一個(gè)能夠被 Webpack 自動(dòng)代碼分割的異步組件
const Foo = () => import('./Foo.vue')
把組件按組分塊
有時(shí)候我們想把某個(gè)路由下的所有組件都打包在同個(gè)異步塊 (chunk) 中
const Foo = () => import(/* webpackChunkName: "group-foo" */ './Foo.vue')
const Bar = () => import(/* webpackChunkName: "group-foo" */ './Bar.vue')
const Baz = () => import(/* webpackChunkName: "group-foo" */ './Baz.vue')
Webpack 會(huì)將任何一個(gè)異步模塊與相同的塊名稱組合到相同的異步塊中毫别。
- 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蚁趁,“玉大人裙盾,你說我怎么就攤上這事∷眨” “怎么了番官?”我有些...
- 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)钢属。 經(jīng)常有香客問我徘熔,道長(zhǎng),這世上最難降的妖魔是什么淆党? 我笑而不...
- 正文 為了忘掉前任酷师,我火速辦了婚禮讶凉,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘山孔。我一直安慰自己懂讯,他們只是感情好,可當(dāng)我...
- 文/花漫 我一把揭開白布台颠。 她就那樣靜靜地躺著褐望,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蓉媳。 梳的紋絲不亂的頭發(fā)上,一...
- 文/蒼蘭香墨 我猛地睜開眼阶冈,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了塑径?” 一聲冷哼從身側(cè)響起女坑,我...
- 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎统舀,沒想到半個(gè)月后匆骗,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
- 正文 獨(dú)居荒郊野嶺守林人離奇死亡誉简,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
- 正文 我和宋清朗相戀三年碉就,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片闷串。...
- 正文 年R本政府宣布肋拔,位于F島的核電站具被,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏只损。R本人自食惡果不足惜一姿,卻給世界環(huán)境...
- 文/蒙蒙 一七咧、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧叮叹,春花似錦艾栋、人聲如沸。這莊子的主人今日做“春日...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至携冤,卻和暖如春悼粮,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背曾棕。 一陣腳步聲響...
- 正文 我出身青樓申尤,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親衙耕。 傳聞我的和親對(duì)象是個(gè)殘疾皇子昧穿,可洞房花燭夜當(dāng)晚...
推薦閱讀更多精彩內(nèi)容
- 學(xué)習(xí)目的 學(xué)習(xí)Vue的必備技能,必須 熟練使用 Vue-router橙喘,能夠在實(shí)際項(xiàng)目中運(yùn)用时鸵。 Vue-rout...
- vue-router學(xué)習(xí)筆記 安裝 并且如果在一個(gè)模塊化工程中使用它,必須要通過Vue.use()明確地安裝路由功...
- Vue-Router簡(jiǎn)介 Vue-Router是Vue.js官方維護(hù)的路由插件厅瞎,同時(shí)也是官方推薦的路由插件寥枝。它與V...
- 導(dǎo)航守衛(wèi) 導(dǎo)航守衛(wèi)主要用來通過跳轉(zhuǎn)或取消的方式守衛(wèi)導(dǎo)航。 參數(shù)或查詢的改變并不會(huì)觸發(fā)進(jìn)入/離開的導(dǎo)航守衛(wèi)磁奖。 1囊拜、全...
- 用Vue.js + vue-router創(chuàng)建單頁應(yīng)用,是非常簡(jiǎn)單的比搭,基本是這樣的: 組件 → 路由 → 渲染地方 ...