vue2 router

vue router筆記

注意點

  1. router-link預設轉成a標籤,添加tag屬性可以替換
  2. $route(頁面組件自己的route屬性)/$router(整個應用只有一個,上面有很多router方法可以用)
  3. router設定檔案中可以設定linkActiveClass與lintExactActiveClass這是路由激活時class名稱的全域的設定
  4. exact-active-class 完全匹配時候被激活此屬性上的class  默認是router-link-exact-active
  5. active-class 模糊匹配時被激活此屬性上的class 默認是router-link-active
  6. exact屬性開啟表示只激活exact-active-class上的class
  7. 第一層以後的路由設定path不需要加上/
  8. 路由可以接收query與props參數
  9. params只能配name,query可以配name與path
  10. router-link上屬性加上:replace="true"會啟動replace模式,默認是push紀錄

配置

#router/index.js
export deafult new VueRouter({
	routes:[
		{
			name:'home',
			path:'/home',
			component:Home,
			children:[
				{	
					name:'news/:id', //:id是params參數 :id?(這樣代表可有可無)
					path:'news', // 第一層以後的路由不需要加上/符號
					component:News,
					//props會傳給定義的組件裡面的props
					//props第一種寫法寫死的參數
					props:{
						id:1
					},
					//props第二種寫法 
					//若props為true會把路由組件收到的params參數傳給定義的組件
					props:true,
					//props第三種寫法
					//值為func返回值的物件一樣會傳給props
					//參數可以接收到當前組件$route這樣就可以選擇要用params或是query
					props($route){
						return {id:$route.query.id}
					}
				}
			]
		}
	],
	linkExactActiveClass:'', //精准匹配時的class
	linkActiveClass:'', //模糊匹配時的class
})

router-link to寫法

#寫法一
<router-link :to="/home/news?id=1">xxx</router-link> //query
<router-link :to="/home/news/1">xxx</router-link> //1是params,對應路由配置站位符號的:id。

#寫法二(東西多的時候用這個)
<router-link :to="{
	path:'/home/news',
	query:{
		id:1
	}
}">xxx</router-link>

#寫法三(使用name的話就不用配置整個路徑短路徑就沒必要使用)
#query傳參
<router-link :to="{
	name:'news',
	query:{
		id:1
	}
}">xxx</router-link>
#params傳參
<router-link :to="{
	name:'news',
	params:{ //params只能給name用不能用path
		id:1
	}
}">xxx</router-link>

#接收參數
$route.query.id
$route.params.id
props:{
	id:Number,
	required:true
}

編程式路由導航$router

#push
$router.push({
	path:'/home/news',
	query:{
		id:1
	}
})

$router.push({
	name:'news',
	query:{
		id:1
	}
})

$router.push({
	name:'news',
	params:{ //params只能給name用不能用path
		id:1
	}
})

#replace
$router.replace(配置與上面一樣)

//以下為控制瀏覽器前進後退的功能
#back
$router.back()

#foward
$router.foward()

#go
$router.go(正負數字)

 

路由緩存

可以保存畫面上的參數

 #單個緩存
 <keep-alive include="news"> //只緩存news(這個是組件的名稱很重要不是路由配置的name)組件名稱的組件,默認是全緩存。
 	<router-view></router-view>
 </keep-alive>
 
 #多個緩存
  <keep-alive include="[news,...]"> //寫成陣列可以緩存多個
 	<router-view></router-view>
 </keep-alive>

 

路由組件生命週期

  1. activated //進入路由時組件被激活的時候
  2. deactivated //離開路由時組件被解除激活的時候

路由守衛

 #router/index.js
 const router = new VueRouter({
	routes:[
		{
			name:'home',
			path:'/home',
			component:Home,
			meta:{ //這裡可以配置想要的訊息
				isAuth:true ,
				title:'home'
			}
		}
	]
})

//路由切換前調用
router.beforeEach((to,from,next)=>{
	console.log(to,'進入的路由訊息')
	console.log(from,'從哪個路由來的訊息')
	console.log(to.meta.isAuth,'判斷是否要驗證')
	next() //此方法必須調用
})

//路由切換之後被調用 主要用於把通過守衛的邏輯程式碼統一寫在這裡
router.afterEach((to,from)=>{
	console.log(to,'進入的路由訊息')
})

export deafult router

單獨前置路由守衛

 #router/index.js
 const router = new VueRouter({
	routes:[
		{
			name:'home',
			path:'/home',
			component:Home,
			meta:{ //這裡可以配置想要的訊息
				isAuth:true ,
				title:'home'
			},
			//單獨前置路由守衛,只有進入此路由時會調用 
			beforeEnter:(to,from,next)=>{
				console.log(to,'進入的路由訊息')
				console.log(from,'從哪個路由來的訊息')
				console.log(to.meta.isAuth,'判斷是否要驗證')
				next() //此方法必須調用
			}
		}
	]
})

組件內路由守衛

#home.vue
export default {
	//藉由路由,進入此組件時候調用
	beforeRouterEnter(to,from,next){
		console.log(to,'進入的路由訊息')
		console.log(from,'從哪個路由來的訊息')
		next() //此方法必須調用
	},
	//藉由路由,離開此組件時候調用
	beforeRouteLeave(to,from,next){
		console.log(to,'進入的路由訊息')
		console.log(from,'從哪個路由來的訊息')
		next() //此方法必須調用
	}
	//由上面兩個可以知道RouterEnter的to與RouterLeave的from會是一樣的
}

路由模式

  1. hash模式(#後面的文字不會被server獲取,兼容性好)
  2. history模式(無#使用history api 比較漂亮但是重整時會有問題要後端服務器配合 )

參考

https://book.vue.tw/CH4/4-4-navigation-guards.html