Vue-router 學習筆記

學習目的

? ? 學習Vue的必備技能情臭,必須 熟練使用 Vue-router茧痒,能夠在實際項目中運用赴精。

Vue-router介紹

? ??Vue Router 是 Vue.js?官方的路由管理器雇初。它和 Vue.js 的核心深度集成戏罢,讓構建單頁面應用變得易如反掌硝清。包含的功能有:嵌套的路由/視圖表辅斟;模塊化的、基于組件的路由配置芦拿;路由參數(shù)士飒、查詢、通配符蔗崎;基于 Vue.js 過渡系統(tǒng)的視圖過渡效果酵幕;細粒度的導航控制;帶有自動激活的 CSS class 的鏈接缓苛;HTML5 歷史模式或 hash 模式裙盾,在 IE9 中自動降級;自定義的滾動條行為。

? ? ? ? 由 前端 來控制頁面的跳轉(但其實是個單頁面)番官,根據不同的?url?地址展示不同的內容和頁面庐完。

? ? ? ? 優(yōu)點:體驗好,不需要每次從服務器獲取全部徘熔,快速展現(xiàn)給用戶门躯;

? ? ? ? 缺點:不利于SEO;使用瀏覽器的前進酷师,后退鍵的時候會重新發(fā)送請求讶凉,沒有合理的利用緩存;單頁面無法記住之前滾動的位置山孔,無法在前進和后退的時候記住滾動的位置懂讯。

Vue-router安裝

? ? ? ? 安裝? npm install vue-router??--save-dev?

? ? ? ? src 目錄下 新建 router 目錄,目錄下新建 index.js

?index.js
引入vue-router

? ? ? ? 在 main.js中引入

實例中使用router

? ?Vue-router 核心

? ? ? ? ? ? ? 路由跳轉的方式

? ? ? ? ? ? ? ? ? ? <router-link to=' '></router-link>? ? 和? ?this.$router.push({path:' '})

路由跳轉
路由設置

????????動態(tài)路由匹配

? ? ? ? ? ? ? ? 動態(tài)路由路徑參數(shù)台颠,以冒號開頭褐望,如上圖的 ↑↑↑↑↑↑↑↑↑↑↑↑↑↑

? ? ? ? ? ? ? ? 獲取路由的參數(shù)

獲取動態(tài)路由的參數(shù)

? ? ? ? ? ? ? ? 當在路由中設置了 props:true 的時候

路由中設置
直接當做props中的屬性使用

? ? ????????官方文檔中的說明

官方文檔中的說明

? ??????????響應路由參數(shù)的變化

? ? ? ? ? ? ? ? ? ? 當路由參數(shù)發(fā)生變化時,比如helloworld/123 導航到 helloworld/456串前,原來的組件實例會被復用瘫里。因為兩個路由都渲染同個組件,比起銷毀再創(chuàng)建荡碾,復用則顯得更加高效谨读。不過,這也意味著組件的生命周期鉤子不會再被調用坛吁。

? ??????????????????復用組件時劳殖,想對路由參數(shù)的變化作出響應的話,可以用以下兩種方式

對路由參數(shù)的變化作出響應
生命周期鉤子不會再被調用

? ? ? ? ? ? ? ? 比如 mounted ,created 不會再被調用? 拨脉, 以上 兩種方式 監(jiān)聽參數(shù)變化闷尿,作出相應的業(yè)務邏輯處理。


? ? ? 嵌套路由

子路由
渲染位置

? ??????????????當你訪問?/layout 時女坑,layout?的 router-view 是不會渲染任何東西填具,這是因為沒有匹配到合適的子路由。如果你想要渲染點什么匆骗,可以提供一個 空的 子路由(可以理解為默認輸出)

空子路由

? ????編程式的導航

? ? ? ? ????除了使用??創(chuàng)建 a 標簽來定義導航鏈接劳景,我們還可以借助 router 的實例方法,通過編寫代碼來實現(xiàn):?this.$router.push({path:' '})

? ? ? ? ? ? 文檔示例:

router.push('home')? 碉就;// 字符串

router.push({path:'home'})盟广;??// 對象

router.push({name:'user',params:{userId:123}});??// 命名的路由

router.push({path:'register',query:{plan:'private'}})瓮钥;// 帶查詢參數(shù)筋量,變成 /register?plan=private 烹吵,獲取this.$route.query.plan

注意:如果提供了?path,params?會被忽略桨武,上述例子中的?query?并不屬于這種情況肋拔。取而代之的是下面例子的做法,你需要提供路由的?name?或手寫完整的帶有參數(shù)的?path:

const userId = 123

router.push({ name: 'user', params: { userId }})呀酸;? ? // -> /user/123

router.push({ path: `/user/${userId}` }) 凉蜂;? ? ?// -> /user/123

// 這里的 params 不生效注意這個例子

router.push({ path: '/user', params: { userId }}) ;? ?// -> /user

? ? ??同樣的規(guī)則也適用于?router-link?組件的?to?屬性性誉。

以上規(guī)則同樣適用于router-link

? ??????router.go(n)??這個方法的參數(shù)是一個整數(shù)窿吩,意思是在 history 記錄中向前或者后退多少步,類似?window.history.go(n)错览。

????????router.go(1) 纫雁;?// 在瀏覽器記錄中前進一步,等同于 history.forward( )

????????router.go(-1)倾哺; // 后退一步記錄轧邪,等同于 history.back( )

????????router.go(3);??// 前進 3 步記錄


? ??命名路由 和 命名視圖

? ??????????????命名路由?

在?routes?配置中給某個路由設置名稱
?命名路由

? ??????這跟代碼調用?router.push()?是一樣的:

? ?????? this.$router.push({ name:'Helloworld',params:{id:123}});

? ??????????????命名視圖

? ??????????????有時候想同時 (同級) 展示多個視圖悼粮,而不是嵌套展示闲勺,例如創(chuàng)建一個布局曾棕,有?sidebar?(側導航) 和?main?(主內容) 兩個視圖扣猫,這個時候命名視圖就派上用場了。你可以在界面中擁有多個單獨命名的視圖翘地,而不是只有一個單獨的出口申尤。如果?router-view?沒有設置名字,那么默認為?default衙耕。

? ? ? ? ? ? ? ? ? ? ? ? 文檔示例

文檔示例

? ? ??? ? ? ? ? ? 嵌套命名視圖

? 嵌套命名視圖
路由配置
顯示效果

? ??????????重定向 和 別名

? ? ? ? ? ? ? ? 重定向

? ? ? ? ? ? ? ? ? ? 重定向 通過?routes?配置來完成

redirect

? ? ? ? ? ? ? ? ? ? 別名 (文檔示例)

? ??????????????/a?的別名是?/b昧穿,意味著,當用戶訪問?/b?時橙喘,URL 會保持為?/b时鸵,但是路由匹配則為?/a,就像用戶訪問?/a?一樣

const router = new VueRouter({

????????????????routes: [

????????????????????{ path: '/a', component: A, alias: '/b' }

????????????????]})


? ??????????導航守衛(wèi)

? ??????????“導航”表示 路由正在發(fā)生改變厅瞎。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??????????????vue-router?提供的導航守衛(wèi)主要用來通過跳轉或取消的方式守衛(wèi)導航饰潜。有多種機會植入路由導航過程中:全局的, 單個路由獨享的, 或者組件級的

? ? ? ? ? ? ? 記住參數(shù)或查詢的改變并不會觸發(fā)進入/離開的導航守衛(wèi)和簸。你可以通過觀察?$route?對象來應對這些變化彭雾,或使用?beforeRouteUpdate?的組件內守衛(wèi)。

? ? ? ? ? ? ? ? ? ? 個人的理解锁保,導航守衛(wèi)有點類似 中間件薯酝,進入 路由 前 先通過守衛(wèi)半沽,來判斷是否可以通過,進而到達頁面吴菠。

? ?????????????全局守衛(wèi) (在定義router的 地方定義)

全局守衛(wèi)

? ??????????????????全局前置守衛(wèi)?router.beforeEach

? ??????????????????????每個守衛(wèi)方法接收三個參數(shù)

? ??????????????????????to: Route: 即將要進入的目標?路由對象

? ??????????????????????from: Route: 當前導航正要離開的路由

? ??????????????????????next: Function: 一定要調用該方法來?resolve?這個鉤子者填。執(zhí)行效果依賴?next?方法的調用參數(shù)。

? ??????????????????????next(): 進行管道中的下一個鉤子橄务。如果全部鉤子執(zhí)行完了幔托,則導航的狀態(tài)就是?confirmed?(確認的)。

? ??????????????????????next(false): 中斷當前的導航蜂挪。如果瀏覽器的 URL 改變了 (可能是用戶手動或者瀏覽器后退按鈕)重挑,那么 URL 地址會重置到?from?路由對應的地址。

? ??????????????????????next('/')?或者?next({ path: '/' }): 跳轉到一個不同的地址棠涮。當前的導航被中斷谬哀,然后進行一個新的導航。你可以向?next?傳遞任意位置對象严肪,且允許設置諸如?replace: true史煎、name: 'home'?之類的選項以及任何用在?router-link?的?to?prop?或?router.push?中的選項。

? ??????????????????????next(error): (2.4.0+) 如果傳入?next?的參數(shù)是一個?Error?實例驳糯,則導航會被終止且該錯誤會被傳遞給?router.onError()?注冊過的回調篇梭。

? ??????????????????????確保要調用?next?方法,否則鉤子就不會被 resolved酝枢。


? ??????????????????全局解析守衛(wèi)???router.beforeResolve

? ? ? ? ? ? ? ? ? ? ????跟?全局前置守衛(wèi) 一樣恬偷,接收三個參數(shù)

? ??????????????????????這和?router.beforeEach?類似,區(qū)別是在導航被確認之前帘睦,同時在所有組件內守衛(wèi)和異步路由組件被解析之后袍患,解析守衛(wèi)就被調用。

????????????????????????確保要調用?next?方法


? ??????????????????全局后置鉤子?? router.afterEach

? ??????????????????????不會接受?next?函數(shù)也不會改變導航本身

? ? ? ? ? ? 路由獨享的守衛(wèi)(在路由內定義)

路由內的守衛(wèi)

? ??????????????????這些守衛(wèi)與全局前置守衛(wèi)的方法參數(shù)是一樣的竣付。

? ??????????組件內的守衛(wèi)(在組件內定義)

組件內的守衛(wèi)

? ? ? ? ? ? ? ? ? ? ?beforeRouteEnter?守衛(wèi)?不能?訪問?this诡延,因為守衛(wèi)在導航確認前被調用,因此即將登場的新組件還沒被創(chuàng)建。不過古胆,你可以通過傳一個回調給?next來訪問組件實例肆良。在導航被確認的時候執(zhí)行回調,并且把組件實例作為回調方法的參數(shù)逸绎。

? ??????????????????beforeRouteEnter(to,from,next){

????????????????????????next( vm => {

????????????????????????????// 通過 `vm` 訪問組件實例

????????????????????})}

? ??????????????????注意?beforeRouteEnter?是支持給?next?傳遞回調唯一守衛(wèi)惹恃。對于?beforeRouteUpdate?和?beforeRouteLeave?來說,this?已經可用了桶良,所以不支持傳遞回調座舍,因為沒有必要了。

? ??????????????????beforeRouteUpdate(to,from,next){

????????????????????????// just use `this`

????????????????????????this.name = to.params.name陨帆;

????????????????????????next()曲秉;

????????????????????}

? ??????????????????這個離開守衛(wèi)通常用來?禁止用戶在還未保存修改前突然離開?采蚀。該導航可以通過?next(false)?來取消。

? ??????????????????beforeRouteLeave(to,from,next){

????????????????????????const answer = window.confirm('Do you really want to leave? you have ????????????????????????????????????unsaved changes!')承二;

????????????????????????if(answer){

????????????????????????????????next()榆鼠;

????????????????????????????}else{

????????????????????????????????next(false);

????????????????????????????}}


??????????????完整的導航解析流程

????????導航被觸發(fā)亥鸠。

????????在失活的組件里調用離開守衛(wèi)妆够。

????????調用全局的?beforeEach?守衛(wèi)。

????????在重用的組件里調用?beforeRouteUpdate?守衛(wèi) (2.2+)负蚊。

????????在路由配置里調用?beforeEnter神妹。

????????解析異步路由組件。

????????在被激活的組件里調用?beforeRouteEnter家妆。

????????調用全局的?beforeResolve?守衛(wèi) (2.5+)鸵荠。

????????導航被確認。

????????調用全局的?afterEach?鉤子伤极。

????????觸發(fā) DOM 更新蛹找。

????????用創(chuàng)建好的實例調用?beforeRouteEnter?守衛(wèi)中傳給?next?的回調函數(shù)。

?????????過渡動效

? ? ? ? ? ? ? ? ?<router-view>是基本的動態(tài)組件哨坪,所以我們可以用 <transition>組件給它添加一些過渡效果:

transition
在組件內寫動畫效果

? ??????????????????fade-enter:進入過渡的開始狀態(tài)庸疾,元素被插入時生效,只應用一幀后立刻刪除当编。

????????????????????fade-enter-active:進入過渡的結束狀態(tài)届慈,元素被插入時就生效,在過渡過程完成后移除凌箕。

????????????????????fade-leave:離開過渡的開始狀態(tài)拧篮,元素被刪除時觸發(fā)词渤,只應用一幀后立刻刪除牵舱。

????????????????????fade-leave-active:離開過渡的結束狀態(tài),元素被刪除時生效缺虐,離開過渡完成后被刪除芜壁。


? ? ? ? ? ? ? ? ? ? 數(shù)據獲取(以下為 文檔示例 )

? ? ? ? ? ? ? ? ? ? 有時候高氮,進入某個路由后慧妄,需要從服務器獲取數(shù)據。例如剪芍,在渲染用戶信息時塞淹,你需要從服務器獲取用戶的數(shù)據。我們可以通過兩種方式來實現(xiàn):

? ??????????????????導航完成之后獲取:先完成導航罪裹,然后在接下來的組件生命周期鉤子中獲取數(shù)據饱普。在數(shù)據獲取期間顯示“加載中”之類的指示运挫。

? ??????????????????導航完成之前獲取:導航完成前,在路由進入的守衛(wèi)中獲取數(shù)據套耕,在數(shù)據獲取成功后執(zhí)行導航谁帕。

????????????????????從技術角度講,兩種方式都不錯 —— 就看你想要的用戶體驗是哪種冯袍。

? ??????????????????????導航完成后獲取數(shù)據

? ??????????????????當你使用這種方式時匈挖,我們會馬上導航和渲染組件,然后在組件的?created?鉤子中獲取數(shù)據康愤。這讓我們有機會在數(shù)據獲取期間展示一個 loading 狀態(tài)儡循,還可以在不同視圖間展示不同的 loading 狀態(tài)。

假設我們有一個?Post?組件征冷,需要基于?$route.params.id?獲取文章數(shù)據:

官方文檔示例

? ??????????????????????????在導航完成前獲取數(shù)據

????????????????????通過這種方式贮折,我們在導航轉入新的路由前獲取數(shù)據。我們可以在接下來的組件的?beforeRouteEnter守衛(wèi)中獲取數(shù)據资盅,當數(shù)據獲取成功后只調用?next?方法调榄。

官方文檔示例
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市呵扛,隨后出現(xiàn)的幾起案子每庆,更是在濱河造成了極大的恐慌,老刑警劉巖今穿,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件缤灵,死亡現(xiàn)場離奇詭異,居然都是意外死亡蓝晒,警方通過查閱死者的電腦和手機腮出,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來芝薇,“玉大人胚嘲,你說我怎么就攤上這事÷宥” “怎么了馋劈?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長晾嘶。 經常有香客問我妓雾,道長,這世上最難降的妖魔是什么垒迂? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任械姻,我火速辦了婚禮,結果婚禮上机断,老公的妹妹穿的比我還像新娘楷拳。我一直安慰自己材部,他們只是感情好,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布唯竹。 她就那樣靜靜地躺著乐导,像睡著了一般。 火紅的嫁衣襯著肌膚如雪浸颓。 梳的紋絲不亂的頭發(fā)上物臂,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天,我揣著相機與錄音产上,去河邊找鬼棵磷。 笑死,一個胖子當著我的面吹牛晋涣,可吹牛的內容都是我干的仪媒。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼谢鹊,長吁一口氣:“原來是場噩夢啊……” “哼算吩!你這毒婦竟也來了?” 一聲冷哼從身側響起佃扼,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤偎巢,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后兼耀,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體压昼,經...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年瘤运,在試婚紗的時候發(fā)現(xiàn)自己被綠了窍霞。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤奖磁,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站霞赫,受9級特大地震影響球拦,放射性物質發(fā)生泄漏。R本人自食惡果不足惜续搀,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一塞琼、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧禁舷,春花似錦彪杉、人聲如沸毅往。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽攀唯。三九已至,卻和暖如春渴丸,著一層夾襖步出監(jiān)牢的瞬間侯嘀,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工谱轨, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留戒幔,地道東北人。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓土童,卻偏偏與公主長得像诗茎,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子献汗,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內容