1. 程式人生 > >餓了麼慕課網學習手記(一)Vue-router

餓了麼慕課網學習手記(一)Vue-router

1.安裝

直接引入

<script src="vue.js"></script>
<script src="vue-router.js"></script>

npm下載

npm install vue-router

如果在一個模組化工程中使用它,必須要通過 Vue.use() 明確地安裝路由功能:

import Vue from 'vue'
import VueRouter from 'vue-router'

Vue.use(VueRouter)

2.使用

在router下的js檔案中

export default new Router({
routes: [
		path: '/',
		component: View
	]
})

餓了麼中路由例項
在這裡插入圖片描述

3.巢狀路由

實際生活中的應用介面,通常由多層巢狀的元件組合而成。巢狀路由即是在原路由中加一個children屬性,children可以是一個數組,存放這個父路由的所有子路由;也可以是一個路由檔案,檔案中存放的路由都該路由的子路由

上圖中HomePage為父路由元件,children中的路由為該路由的子路由,子路由中的元件會展示在父元件中(父元件中需要用<router-view></router-view>來渲染子路由中的元件)
在這裡插入圖片描述
使用<router-link></router-link>來切換路由
在這裡插入圖片描述

4.動態匹配路由

我們經常需要把某種模式匹配到的所有路由,全都對映到同個元件。例如,我們有一個 User 元件,對於所有 ID 各不相同的使用者,都要使用這個元件來渲染。那麼,我們可以在 vue-router 的路由路徑中使用“動態路徑引數”(dynamic segment) 來達到這個效果:

{
		path:"/seller:id",//通過不同的id來使不同的商家都使用同一個元件,id可傳可不傳
		component: Seller,
}

5.命名路由

有時候,通過一個名稱來標識一個路由顯得更方便一些,特別是在連結一個路由,或者是執行一些跳轉的時候。你可以在建立 Router 例項的時候,在 routes 配置中給某個路由設定名稱

{
		path:"/seller:id",//通過不同的id來使不同的商家都使用同一個元件,id可傳可不傳
		name: seller,
		component: Seller,
}

要連結到一個命名路由,可以給 router-link 的 to 屬性傳一個物件,物件中可傳遞引數:

<router-link :to="{ name: 'seller', params: { id: 123 }}">User</router-link>

6.命名檢視

有時候想同時 (同級) 展示多個檢視,而不是巢狀展示,例如建立一個佈局,有 sidebar (側導航) 和 main (主內容) 兩個檢視,這個時候命名檢視就派上用場了。你可以在介面中擁有多個單獨命名的檢視,而不是隻有一個單獨的出口。如果 router-view 沒有設定名字,那麼預設為 default。

<router-view></router-view>
<router-view></router-view>

每個路由都被渲染了兩次

<router-view name='sidebar'></router-view>
<router-view name='main'></router-view>

一個檢視使用一個元件渲染,因此對於同個路由,多個檢視就需要多個元件。確保正確使用 components 配置 (帶上 s):

routes: [
	{
  		path: '/',
  		components: {
    			default: Main,
    			sidebar: Sidebar,
    			main: Main
  		}
	}
]

7.重定向和別名

重定向
重定向(Redirect)就是通過各種方法將各種網路請求重新定個方向轉到其它位置,用於網站調整或網頁被移到一個新地址,它也是通過 routes 配置來完成,下面例子是從 /a 重定向到 /b:

routes: [
	{ 
		path: '/a', 
		redirect: '/b' 
	}
]

別名

/a 的別名是 /b,意味著,當用戶訪問 /b 時,URL 會保持為 /b,但是路由匹配則為 /a,就像使用者訪問 /a 一樣。簡單的說就是給 /a 起了一個外號叫做 /b ,但是本質上還是 /a

上面對應的路由配置為:

routes: [
	{ 
		path: '/a', 
		component: A, 
		alias: '/b' 
	}
]

『別名』的功能讓你可以自由地將 UI 結構對映到任意的 URL,而不是受限於配置的巢狀路由結構。

8.程式設計式導航

除了使用 建立 a 標籤來定義導航連結,我們還可以藉助 router 的例項方法,通過編寫程式碼來實現

router.push('/');//字串
router.push({path: '/'});//物件
router.push({
		name: 'homePage',
		params: {
			id: '123'
		     }
	})//命名路由

#router.replace()與router.push()類似,但router.push()會像history棧新增記錄,可以通過router.go(n)來向前和向後多少步來切換路由,router.replace()不會

9.路由元件傳參

布林模式
如果 props 被設定為 true,route.params 將會被設定為元件屬性

routes: [
	{ 
		path: '/user/:id', 
		component: User, 
		props: true 
	}
]

物件模式
如果 props 是一個物件,它會被按原樣設定為元件屬性。當 props 是靜態的時候有用

routes: [
	{ 
		path: '/promotion/from-newsletter', 
		component: Promotion, 
		props: { 
			newsletterPopup: false 
		} 
	}
]

函式模式
你可以建立一個函式返回 props。這樣你便可以將引數轉換成另一種型別,將靜態值與基於路由的值結合等等

routes: [
	{ 
		path: '/search', 
		component: SearchUser, 
		props: (route) => ({ 
			query: route.query.q 
		}) 
	}
]

#<router-link></router-link>也可以傳遞引數,子元件使用props接收

<router-link :seller='seller'></router-link>