State Vuex не работает правильно с проблемой Nuxt.js

1

Я пытаюсь установить состояние 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 нет (

  • 0
    Не могли бы вы добавить действие setApp к вашему вопросу? Кроме того, я не думаю, что вы входите в нужное место, поскольку created и mounted хуки жизненного цикла будут выполнены до того, как будет произведена ваша fetch .
  • 0
    @ThomasFerro да, конечно, теперь вы можете посмотреть на него)
Показать ещё 6 комментариев
Теги:
vue.js
vuex
nuxt.js

1 ответ

2
Лучший ответ

Как указано в документах

Чтобы сделать метод выборки асинхронным, верните 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);
  })
}
  • 0
    О, МОЙ БОГ !! БЛАГОДАРЮ ВАС !!!!! BRO

Ещё вопросы

Сообщество Overcoder
Наверх
Меню