javascript - 在 beforeEach 期间将 vuex 模块状态传递给 vue-router

标签 javascript vue.js vue-router vuex

我将 VueJS 与 vuexvue-router 结合使用。我有一个 vuex 模块正在对其商店进行修改,并尝试使用它来确定用户是否已通过身份验证。

这是我的代码在相关部分的样子。

ma​​in.js

import Vue from 'vue'
import App from './App.vue'
import store from './store'
import router from './router'

router.beforeEach((to, from, next) => {
    console.log(router.app) // prints a Vue$2 object
    console.log(router.app.$store) // undefined
    console.log(store.getters.isAuthenticated) // false
    ...
}

const app = new Vue({
  store,
  router,
  ...App
})

app.$mount('#app')

/store/index.js

import Vue from 'vue'
import Vuex from 'vuex'
import core from './modules/core'

Vue.use(Vuex)

const store = new Vuex.Store({
  modules: {
    core: core
  }
})

export default store

/store/modules/core.js

import * as types from '../types'
import api from '../../api'
import router from '../../router'

const state = {
  token: null,
  user: null,
  authenticated: false
}

const mutations = {
  [types.LOGIN_SUCCESS] (state, payload) {
    console.log('mutate')
    state.token = payload.token
    state.user = payload.user
    state.authenticated = true
    router.go('/')
  }
}

const getters = {
  isAuthenticated: state => {
    return state.authenticated
  }
}

const actions = {
  [types.LOGIN] (context, payload) {
    api.getToken(payload).then(response => {
      context.commit(types.LOGIN_SUCCESS, response)
    })
  }
}

export default {
  state,
  mutations,
  actions,
  getters
}

当我通过我的逻辑触发 LOGIN 操作时,我可以看到突变正确执行,并且当我使用 Chrome 扩展查看我的 core< 的 vuex 状态时 模块,userauthenticated 的状态已经正确改变。

问题

当路由器在 .beforeEach 循环中运行时,似乎这个模块还没有被加载。这是真的吗?

如果是,对于如何处理这种情况还有哪些其他建议? 如果不是,我做错了什么?

最佳答案

console.log(store.state.core.authenticated) 返回 false 因为您还没有登录。

在您的代码中,您不会在任何地方保留用户信息。例如。使用本地存储

同样的考虑:

  1. 不使用router.app.$store,使用您导入的store
  2. 在您的LOGIN_SUCCESS 突变中,将登录信息和 token 存储到本地存储
  3. 在您的 beforeEach Hook 中,检查本地存储,如果填充了 token ,则获取用户信息并应用变更。如果没有,只需调用登录页面

像这样的..

const mutations = {
  [types.LOGIN_SUCCESS] (state, payload) {
    state.token = payload.token
    state.user = payload.user
    state.authenticated = true
    localstorage.setItem('token', payload.token)
    localstorage.setItem('user', payload.user)
  }
}

const actions = {
  [types.LOGIN] (context, payload) {
    return api.getToken(payload).then(response => {
      context.commit(types.LOGIN_SUCCESS, response)
      return response
    })
  }
}

router.beforeEach((to, from, next) => {
    let user = localstorage.getItem('user')
    let token = localstorage.getItem('token')
    if (user && token) {
      store.commit(types.LOGIN_SUCCESS, {token, user})
      next()
    }
    else if (!store.getters.isAuthenticated) {
      store.dispatch(types.LOGIN).then(() => next())
    } else {
      next()
    }
}

关于javascript - 在 beforeEach 期间将 vuex 模块状态传递给 vue-router,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39940665/

相关文章:

javascript - 使用一个输入 javascript 处理目录/文件上传

javascript - 无法使用 vue-validator 添加动态验证

vue.js - 如何缓存其他路线以供离线浏览?

vue-router - 在 vuetify.js 中,将路由器路径指定为属性(<v-btn to ="/path">)使按钮看起来像是处于 "hover"状态

javascript - 寻找在 Node.js 中发布数千个 HTTP 请求的有效方法

javascript - Jquery offset().left 和 position().left 返回意外值

javascript - 如何检查 JWT token 有效性

vue.js - vuejs [v-cloak] css 规则将我的内容隐藏在 sailsjs 中

javascript - vue-路由器 : failed to resolve async component render

javascript - 选择 JavaScript 数组中的最后一个元素