引:vue-router 提供的导航守卫主要用来通过跳转或取消的方式守卫导航。有多种机会植入路由导航过程中:全局的, 单个路由独享的, 或者组件级的。
全局的是在router对象上定义的守卫,比如:
const router = new VueRouter({ ... })
router.beforeEach((to, from, next) => {
// ...
})
注意一定别忘了调用next()才能正常解析。
单个路由独享的,就是在针对个别路由定义的守卫,比如:
const router = new VueRouter({
routes: [
{
path: '/foo',
component: Foo,
beforeEnter: (to, from, next) => {
// ...
}
}
]
})
这些守卫与全局前置守卫的方法参数是一样的。
最后,详细介绍一下组件内守卫,因为这个不是那么直观地可以被理解,比如
<template>
<div>
<ol>
<li v-for="arg in $route.params">我是: {{arg}}</li>
</ol>
<br/>
<div v-show="paradis">我的属性有: {{$route.params}}</div>
</div>
</template>
<script type="text/ecmascript-6">
export default {
data () {
return {
paradis: false
}
},
beforeRouteEnter (to, from, next) {
// 在渲染该组件的对应路由被 confirm 前调用
// 不!能!获取组件实例 `this`
// 因为当守卫执行前,组件实例还没被创建
console.log(to)
console.log(from)
console.log(next)
next(vm => {
console.log(vm)
})
},
methods: {
paraShow () {
this.paradis = true
}
}
}
</script>
<style lang="stylus" rel="stylesheet/stylus">
</style>
beforeRouteEnter 守卫 不能 访问 this,因为守卫在导航确认前被调用,因此即将登场的新组件还没被创建。所以在next()中定义了一个回掉,我们就可以访问组件内的属性方法了。
至于,后面两个守卫
beforeRouteUpdate (to, from, next) {
// 在当前路由改变,但是该组件被复用时调用
// 举例来说,对于一个带有动态参数的路径 /foo/:id,在 /foo/1 和 /foo/2 之间跳转的时候,
// 由于会渲染同样的 Foo 组件,因此组件实例会被复用。而这个钩子就会在这个情况下被调用。
// 可以访问组件实例 `this`
// 别忘了调用next
},
beforeRouteLeave (to, from, next) {
// 导航离开该组件的对应路由时调用
// 可以访问组件实例 `this`
}
上面的注释说的非常清晰,调用方法和beforRouteEnter是一样的