在 beforeEach 期间将 vuex 模块状态传递给 vue-router
Passing vuex module state into vue-router during beforeEach
我将 VueJS 与 vuex
和 vue-router
结合使用。我有一个 vuex
模块正在对其存储进行修改,并尝试使用它来确定用户是否已通过身份验证。
这是我的代码在相关部分的样子。
main.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 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
模块,user
和 authenticated
的状态已经正确改变。
问题
路由器在 .beforeEach
循环中 运行 时,似乎这个模块还没有加载。这是真的吗?
如果是,对于如何处理这种情况还有哪些其他建议?
如果不是,我做错了什么?
console.log(store.state.core.authenticated)
return false 因为您还没有登录。
在您的代码中,您不会在任何地方保留用户信息。例如。使用本地存储
同样的考虑:
- 不使用
router.app.$store
,使用您导入的 store
- 在您的
LOGIN_SUCCESS
突变中,将登录信息和令牌存储到本地存储
- 在您的
beforeEach
挂钩中,检查本地存储,如果填充了令牌,则获取用户信息并应用突变。如果没有,就调用登录页面
像这样..
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()
}
}
我将 VueJS 与 vuex
和 vue-router
结合使用。我有一个 vuex
模块正在对其存储进行修改,并尝试使用它来确定用户是否已通过身份验证。
这是我的代码在相关部分的样子。
main.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 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
模块,user
和 authenticated
的状态已经正确改变。
问题
路由器在 .beforeEach
循环中 运行 时,似乎这个模块还没有加载。这是真的吗?
如果是,对于如何处理这种情况还有哪些其他建议? 如果不是,我做错了什么?
console.log(store.state.core.authenticated)
return false 因为您还没有登录。
在您的代码中,您不会在任何地方保留用户信息。例如。使用本地存储
同样的考虑:
- 不使用
router.app.$store
,使用您导入的store
- 在您的
LOGIN_SUCCESS
突变中,将登录信息和令牌存储到本地存储 - 在您的
beforeEach
挂钩中,检查本地存储,如果填充了令牌,则获取用户信息并应用突变。如果没有,就调用登录页面
像这样..
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()
}
}