如果你使用 Vue,你可能已經(jīng)知道它的路由功能非常強(qiáng)大。但是,有時(shí)我們需要單獨(dú)對(duì)某些路由進(jìn)行攔截,例如檢查用戶是否已經(jīng)登錄。在這種情況下,Vue提供了一個(gè)簡(jiǎn)單且容易實(shí)現(xiàn)的解決方案:使用單獨(dú)路由攔截。
const router = new VueRouter({
routes: [
{
path: '/',
component: Home,
meta: { requiresAuth: true }
},
{
path: '/login',
component: Login
}
]
})
在上面的代碼中,我們定義了兩個(gè)路由:'/'和'/login'。但是,注意到在'/'路由定義中,我們添加了一個(gè)meta字段,該字段設(shè)置了屬性requiresAuth為true。
現(xiàn)在,在路由切換時(shí),我們可以使用路由守衛(wèi)來(lái)攔截該特定路由,并檢查用戶是否具有權(quán)限。
router.beforeEach((to, from, next) => {
if (to.matched.some(record => record.meta.requiresAuth)) {
if (!auth.loggedIn()) {
next({
path: '/login',
query: { redirect: to.fullPath }
})
} else {
next()
}
} else {
next()
}
})
在上面的代碼中,我們使用了router.beforeEach()方法來(lái)添加路由守衛(wèi)。對(duì)于每個(gè)要訪問(wèn)的路由都可以使用該方法。在這個(gè)守衛(wèi)中,我們檢查即將訪問(wèn)的路由是否設(shè)置了requiresAuth為true。如果是這樣,我們調(diào)用auth.loggedIn()方法來(lái)檢查用戶是否已經(jīng)登錄。如果用戶未登錄,我們將重定向用戶到登錄頁(yè)面,并將當(dāng)前路徑添加到查詢參數(shù)中,以便登錄后可以返回到之前的位置。如果用戶已經(jīng)登錄,則直接next()調(diào)用。
如果路由沒(méi)有設(shè)置requiresAuth屬性,則不需要攔截該路由,直接調(diào)用next()即可。
我們也可以使用router.afterEach()方法來(lái)添加一個(gè)后置鉤子函數(shù)。此函數(shù)將在路由切換后調(diào)用。
router.afterEach((to, from) => {
// Do something after each router change
})
在實(shí)際應(yīng)用中,我們可以使用單獨(dú)路由攔截來(lái)檢查用戶權(quán)限,檢查表單數(shù)據(jù)或者其他需要攔截的情況。當(dāng)然,該方法只是Vue路由的一小部分。Vue路由還有許多其他功能,如命名路由、動(dòng)態(tài)路由、路由嵌套等。在使用Veu時(shí),我們可以根據(jù)需要選擇使用這些功能。