Vue-router
动态路由
动态路由是通过在路由中添加参数来实例渲染不同的数据,如果一个用户组件渲染不同用户。
/user/:id —> /user/foo:/user/bar
/user/:id/posts/:postid —> /user/foo:/user/bar
这个参数可以在路由对象中获取。如组件方法中:this.$route.params.id
注意: 使用路由参数时,由于两个路由渲染的是同一个组件,为了高效,组件实例会复用。不过这样会导致生命周期钩子函数不会调用。也不会触发进入、离开的导航守卫。
组件中的路由对象
可以在组件中通过 this.$route
调用路由对象,this.$router
调用路由实例。
在组件中获取路由参数或路由查询参数时:
this.$route.params
是一个对象,里面包含所有路由参数。
this.$route.query
是一个对象,里面包含所有路由查询参数。
使用
props
将组件和路由解耦: 无需在组件内调用$route,在配置路由时加上props属性
1 | { |
守卫导航
1 | function callback(to, from, next) { |
所以路由守卫有两种执行顺序
正常路由:
beforeEach(全局前置守卫)
beforeEnter(路由独享守卫)
beforeRouteEnter(组件内守卫)
beforeResolve(解析守卫)
afterEach(全局后置钩子)
【没有: beforeRouteUpdate(组件内守卫),beforeRouteLeave(组件内守卫)】
路由复用:
beforeEach(全局前置守卫)
beforeRouteUpdate(组件内守卫)
beforeResolve(解析守卫)
afterEach(全局后置钩子)
【没有: beforeEnter(路由独享守卫) ,beforeRouteEnter(组件内守卫), beforeRouteLeave(组件内守卫)】
注意 :
1、以上的执行顺序是所有守卫里 next() 函数前执行的顺序。
2、next函数后的内容是反过来执行,整个路由守卫执行过程就是一个递归调用栈。
3、组件所有生命周期的钩子在守卫之后执行。