全局前置守卫
beforeEach
router.beforeEach((to, from, next))
to 表示将要去的路由地址
from 表示将要离开的路由地址
next 函数
next() 表示下一步到什么地方去 决定了我们能不去执行下一步的操作
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<!--
现在从学校出发 去公园 不要门票
去动物园 必须有门票 没有门票不让进
-->
<div id="app">
<router-view></router-view>
</div>
<!-- 自己引入 -->
<script src="vue.js"></script>
<script src="vue-router.js"></script>
<script>
const school={
template: `
<div class="school">
学校
<router-link to="/park">去公园</router-link>
<router-link to="/zoo">去动物园</router-link>
<router-link to="/art">去艺术中心</router-link>
</div>
`
}
const park={
template: `
<div class="park">公园</div>
`
}
const art={
template: `
<div class="art">艺术中心</div>
`
}
const zoo={
template: `
<div class="zoo">
动物园
<router-link to="/zoo/tiger">去老虎园</router-link>
<router-link to="/zoo/monkey">去猩猩园</router-link>
<router-view></router-view>
</div>
`
}
const tiger={
template: `
<div class="tiger">老虎园</div>
`
}
const monkey={
template: `
<div class="monkey">猩猩园</div>
`
}
const ticket={
template: `
<div class="ticket">
售票处
<button @click="buy">购票</button>
</div>
`,
methods: {
buy() {
localStorage.setItem('ticket', 1)
router.push(this.$route.query.returnUrl)
}
}
}
const routes=[
{
path: '/',
component: school
},
{
path: '/park',
component: park
},
{
path: '/zoo',
component: zoo,
meta: {
// 路由元信息
auth: true
},
children: [
{
path: 'tiger',
component: tiger
},
{
path: 'monkey',
component: monkey
}
]
},
{
path: '/ticket',
component: ticket
},
{
path: '/art',
component: art,
meta: {
auth: true
}
}
]
const router=new VueRouter({
routes
})
router.beforeEach((to,from,next)=> {
console.log(to,from)
// if(to.path=='/zoo' || to.path=='/art') {
// if(to.meta.auth){ // 只要路由中有meta属性 我们就需要对当前的路径进行购票验证
// 只要matched数组中任意一个包含meta验证 那么其子路由自动匹配验证
if(to.matched.some(route=> route.meta.auth)){
if(localStorage.getItem('ticket')) {
next()
}else {
next('/ticket?returnUrl='+to.path) // 可以直接跳转到售票的组件中
}
}else {
next()
}// 如果导航守卫中有next函数 则必须写上next() 否则路由不继续执行
})
new Vue({
el: "#app",
router
})
</script>
</body>
</html>
beforeReaolve 全局解析守卫
全局前置守卫(beforeEach)在导航开始就已经守卫
全局解析守卫会在全局前置守卫后执行
beforeResolve比beforeEach晚一点
beforeEach时,组件还没有被解析 beforeResolve组件被解析
afterEach 全局后置钩子
当路由跳转完成之后执行一些代码时 可以使用全局后置钩子
因为路由已经完成了跳转 所以 在afterEach不包含next
router.afterEach((to, from)=> {
// 导航完成之后 要执行的代码
})
路由独享守卫(beforeEnter)
给某一个路由单独添加
就像单独给路由添加了beforeEach一样
组件内守卫
beforeRouteEnter
beforeRouteUpdate
beforeRouteLeave
可以直接在路由组件的模板中 定义导航守卫
注意:
当前守卫有很多 但是我们必须掌握的守卫 全局前置守卫(beforeEach)