Używam VueJS w połączeniu z vuex
i vue-router
. Mam moduł vuex
, który dokonuje mutacji w swoim sklepie i próbuje użyć tego do ustalenia, czy użytkownik jest uwierzytelniany.Przekazywanie stanu modułu vuex do vue-routera podczas poprzedniej opcji.
Oto, jak wygląda mój kod w odpowiedniej części.
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$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
}
Kiedy Przechodzę przez moją logikę, aby wywołać akcję LOGIN
, widzę, że mutacja została wykonana poprawnie, a kiedy używam rozszerzenia Chrome do przeglądania stanu vuex dla mojego modułu core
, stan dla user
i authenticated
został odpowiednio zmutowany.
PYTANIE
Wydaje się, że ten moduł po prostu nie został załadowany przez czas router jest uruchomiony w pętli .beforeEach
. Czy to prawda?
Jeśli tak, jakie są inne sugestie dotyczące radzenia sobie z tą sytuacją? Jeśli nie, co robię nieprawidłowo?
co masz, jeśli log 'store.state.core.authenticated'? –
@francoisromain 'console.log (store.state.core.authenticated)' zwraca 'false' –
MYŚLĘ, że wymyśliłem problem. Ale dopóki nie zrobię trochę więcej badań ... Nie zamieszczę mojej własnej odpowiedzi. Wygląda na to, że stan nie jest trwały i nie korzysta z czegoś takiego jak lokalny magazyn HTML5. Dlatego przy każdym ładowaniu strony stan jest pusty. Tak więc muszę przenieść mojego użytkownika do localstorage (lub jakiegoś równoważnego), aby uzyskać taki rodzaj uporczywości. Mam działające rozwiązanie i opublikuję go, gdy będę miał większą pewność, że jest to najlepsza metoda. –