鍍金池/ 問(wèn)答/HTML/ vue-router登錄狀態(tài)檢測(cè)?

vue-router登錄狀態(tài)檢測(cè)?

一共3個(gè)頁(yè)面,默認(rèn)指向login頁(yè)面,登陸后存儲(chǔ)client_id到cookie和global.CLIENT_ID

我想做的是登錄狀態(tài)檢測(cè),頁(yè)面跳轉(zhuǎn)時(shí)檢查global.CLIENT_ID或者cookie,不存在就跳轉(zhuǎn)到login頁(yè)面去。

// 路由頁(yè)面
import main from './components/main/main.vue';
import star from './components/star/star.vue';
import login from './components/login/login.vue';


// 路由配置
const routes = [
    {
        name: 'main',
        path: '/main',
        component: main,
        // meta: {
        //     login_required: true
        // }
    },
    {
        name: 'star',
        path: '/star',
        component: star,
        // meta: {
        //     login_required: true
        // }
    },

    {
        name: 'login',
        path: '/login',
        component: login,
        // meta: {
        //     login_required: false
        // }
    },
    {
        path: '/',
        redirect: '/login'
    }
];

const router = new VueRouter({
    routes: routes
});

new Vue({
    el: '#app',
    components: {App},
    template: '<App/>',
    router: router
})

我百度了一下相關(guān)的問(wèn)題,有人說(shuō)可以用router鉤子,可我試了一下

router.beforeEach(function (to, from, next) {
    if(to.name === 'main' || to.name === 'star'){
        next('/login');
    }

    else{
        next();
    }

});

即使是這樣,也會(huì)存在兩個(gè)問(wèn)題:
1、如果直接在瀏覽器地址欄輸入http://localhost:8080/#/main,可以直接略過(guò)邏輯訪問(wèn)到main
2、當(dāng)前頁(yè)面是main,點(diǎn)擊一次star會(huì)跳轉(zhuǎn)到login,但再次點(diǎn)擊star,就會(huì)跳轉(zhuǎn)到star.

我也嘗試在main.js中watch global.CLIENT_ID,但報(bào)錯(cuò)說(shuō)遞歸太多。

請(qǐng)給我一個(gè)思路,或者相關(guān)代碼,謝謝。

回答
編輯回答
糖果果

在路由攔截中寫(xiě)是正確的,往下的思路你沒(méi)想透
如果要去的登陸頁(yè),不判斷有無(wú)本地信息
如果去的是其它頁(yè)面,有本地登陸信息且未超時(shí)過(guò),否則轉(zhuǎn)登陸頁(yè)
show my code

    if(to.name==="login"){
        next();
    }else{
        if(loginInfo){
            // 這里要加一個(gè)有登陸信息比對(duì)時(shí)間
            next()
        }else{
            next("login")
        }
    }

另一個(gè)大佬的回答,供參考:
https://segmentfault.com/q/10...

2017年11月30日 16:49
編輯回答
悶油瓶

看了樓主的題目我來(lái)打一個(gè)馬后炮。

這是vue-router對(duì)于導(dǎo)航守衛(wèi)的描述

clipboard.png

由此可見(jiàn) beforeEach/afterEach 這樣的守衛(wèi)確實(shí)不會(huì)在初次進(jìn)入的時(shí)候觸發(fā),那么怎么辦呢?

答案是 router.onReady 方法

clipboard.png

這個(gè)我在自己項(xiàng)目中是如此解決的,至于登錄狀態(tài),建議的是使用 vuex 的 state 去保存。

2017年6月14日 21:58
編輯回答
風(fēng)畔
if (to.name === 'login') {
  next('/login')
}
if (global.CLIENT_ID) {
  next()
} else {
  next('/login')
}
2017年3月14日 04:55