Vue3中的导航守卫与Vue2中的类似,用于在路由跳转过程中进行控制和处理。Vue3提供了三种导航守卫:全局前置守卫、路由独享守卫和组件内守卫。
全局前置守卫
全局前置守卫是在路由跳转前进行拦截的守卫,可以用来进行用户身份验证、处理路由参数等操作。在Vue3中,可以通过router.beforeEach方法来定义全局前置守卫:
const router = createRouter({
history: createWebHistory(),
routes: [...]
})
router.beforeEach((to, from, next) => {
// to: 即将跳转的路由对象
// from: 当前导航正要离开的路由
// next: 用来确认跳转的函数
// 用户身份验证
if (to.meta.requireAuth) {
const token = localStorage.getItem('token')
if (token) {
next()
} else {
next('/login')
}
} else {
next()
}
})
路由独享守卫
路由独享守卫是在单个路由配置中进行拦截的守卫,可以用来进行特定路由的身份验证、处理路由参数等操作。在Vue3中,可以通过beforeEnter配置项来定义路由独享守卫:
const router = createRouter({
history: createWebHistory(),
routes: [
{
path: '/account',
component: Account,
beforeEnter: (to, from, next) => {
// 路由独享守卫
const token = localStorage.getItem('token')
if (token) {
next()
} else {
next('/login')
}
}
}
]
})
组件内守卫
组件内守卫是在单个Vue组件中进行拦截的守卫,可以用来进行特定组件的身份验证、处理组件参数等操作。在Vue3中,可以通过beforeRouteEnter、beforeRouteUpdate和beforeRouteLeave三种方法来定义组件内守卫:
const Account = {
template: `
<div>
<h1>My Account</h1>
<p>{{username}}</p>
</div>
`,
beforeRouteEnter(to, from, next) {
// 组件内守卫 - beforeRouteEnter
const token = localStorage.getItem('token')
if (token) {
next(vm => {
// 在路由导航确认前执行,可以访问组件实例
vm.username = localStorage.getItem('username')
})
} else {
next('/login')
}
},
beforeRouteUpdate(to, from, next) {
// 组件内守卫 - beforeRouteUpdate
const token = localStorage.getItem('token')
if (token) {
this.username = localStorage.getItem('username')
next()
} else {
next('/login')
}
},
beforeRouteLeave(to, from, next) {
// 组件内守卫 - beforeRouteLeave
const answer = confirm('Are you sure you want to leave?')
if (answer) {
next()
} else {
next(false)
}
},
data() {
return {
username: ''
}
}
}