getters 在 vuex 中总是返回 true

Posted

技术标签:

【中文标题】getters 在 vuex 中总是返回 true【英文标题】:getters is always return true in vuex 【发布时间】:2021-11-16 17:15:23 【问题描述】:

如果没有来自 API 的令牌,getter 中的 isLoggedIn 始终是 true 事件,我仍然可以转到每条路由,但我不知道保护路由中的错误是什么,或者我在状态中存储了错误的令牌。在此语句中不起作用 if(!store.getters.isLoggedIn) go to login 请帮助我,我被卡住了:(

在 store.js 中

state:
    Token: localStorage.getItem('access_token') || null,

mutations:
    AUTHENTICATION(state,token)
        state.Token = token;
    ,
    UNAUTHENTICATION(state,response)
        state.Token = response;
    
,
getters:
    isLoggedIn(state)
        return state.Token !=null;
    
,
actions:
    loginUser(commit, formData)                
          http.post("/login",formData).then((response)=>
                if(response.data.status === 'success')
                    const token = response.data.token;
                    localStorage.setItem('access_token',token);
                    localStorage.setItem('user',response.data.user);
                    commit('AUTHENTICATION',token);                         
                    router.push(name:'Dashboard');
                    router.go();
                else
                    commit("LOGIN_ERROR",response.data.message);
                
            )
            .catch((error)=>
                if(error)
                    commit('UNAUTHENTICATION',null);                        
                    localStorage.removeItem('access_token');
                    commit("GET_ERRORS",error.response.data.errors);
                
            );
        );
    ,
    logoutUser(commit)
        http.post("/auth/logout").then((response)=>
            if(response.data.status === "success")
                localStorage.clear();
                commit('UNAUTHENTICATION',null);
                router.push(name:'Login');
                window.location.reload();
            else
                commit("LOGIN_ERROR",response.data.message);
            
        )
        .catch((error)=>
            if(error)
                commit("GET_ERRORS",error.response.data.errors);
            
        );
    
,

在 route.js 中

route.beforeEach((to, from, next) => 
    const requiresAuth = to.matched.some(record => record.meta.requiresAuth);
    if(requiresAuth) 
        if(!store.getters.isLoggedIn)
            next(name: 'Login'); 
        else
            next();
        
    else
        next();
    
);

【问题讨论】:

在 getter 中尝试 console.log(state.Token) 确保数据 令牌仍然存在,但它仍然无法正常工作:(我该怎么做我被困了将近一个星期。 【参考方案1】:

尝试:

if(!store.getters.isLoggedIn || store.getters.isLoggedIn === '') 
  //...

和吸气剂:

 isLoggedIn: (state) => state.Token,

【讨论】:

当我在 route.js 中的 console.log(store.getters.isLoggedIn) 显示 isLoggedIn(state) return state.Token !=null; 时不起作用 现在试试,请更新答案 我试过了,但我不知道如何解决这个问题:(【参考方案2】:

虽然您的本地存储中没有access_token,但localStorage.getItem('access_token') 将返回值undefined,它在non-strict not version != 中不等于null,所以你getter永远是真的 相反,您应该使用 (strict not version) 或 (double not version ):选项 1:

getters:
    isLoggedIn(state)
        return state.Token !== null; //double equals
    

选项 2:

getters:
    isLoggedIn(state)
        return !!state.Token; // double !
    

【讨论】:

不工作 :( . !store.getters.isLoggedIn 的结果总是返回 false 是什么意思?

以上是关于getters 在 vuex 中总是返回 true的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 Vuex getter 在客户端返回 TRUE 而在服务器端返回 FALSE?

将 Getter 传递给 Vuex Action 返回 null

无法从路由器中的 getter 获取数据。 [Vuex,类星体]

使用 Vuex getter 进行 Vuetify Select

vuex

vuex状态管理