Я пытаюсь установить состояние vuex в моем приложении Nuxt.js, но он работает неправильно. Поэтому здесь я устанавливаю свое состояние с методом выборки:
fetch({app, store, route}) {
app.$axios.$get('apps/${route.params.id}')
.then(res => {
store.dispatch('setApp', {
...res,
id: route.params.id
})
console.log(app.store.state.app);
})
}
Здесь все работает исправно, когда я регистрирую app.store, данные есть, но когда я пытаюсь войти в него:
created() {
console.log(this.$store);
},
mounted() {
console.log(this.$store);
}
Здесь мой код магазина:
const store = () => new Vuex.Store({
state: {
app: ''
},
mutations: {
'SET_APP' (state, payload) {
state.app = payload
}
},
actions: {
setApp (ctx, payload) {
ctx.commit('SET_APP', payload)
}
},
getters: {
}
})
я не работаю, мое состояние пустое, поэтому данные не отображаются на моем шаблоне (я надеюсь, что кто-то должен мне помочь!
PS: Также, когда он регистрируется на стороне клиента, все работает нормально, но в SSR нет (
Как указано в документах
Чтобы сделать метод выборки асинхронным, верните Promise, Nuxt.js будет ожидать, что обещание будет разрешено перед рендерингом компонента.
В приведенном выше примере кода запрос acios сделан внутри крюка fetch
, но Nuxt не будет ждать его разрешения, поскольку обещают не возвращаются, поэтому он сохраняет рендеринг компонента, тем самым запуская created
и mounted
крючки, которые к моменту обращения делают не заполнили $store
.
Чтобы заставить его работать, вы должны вернуть обещание из метода fetch
.
Если в вашем приложении нет дополнительного кода, просто добавив оператор return
он решит проблему:
fetch({app, store, route}) {
return app.$axios.$get('apps/${route.params.id}')
.then(res => {
store.dispatch('setApp', {
...res,
id: route.params.id
})
console.log(app.store.state.app);
})
}
setApp
к вашему вопросу? Кроме того, я не думаю, что вы входите в нужное место, посколькуcreated
иmounted
хуки жизненного цикла будут выполнены до того, как будет произведена вашаfetch
.