@smlwmy

Как получить асинхронное состояние vuex?

store/profile.js

import Axios from 'axios'

const state = {
  profile: null
}

const actions = {
 loadProfileOnce: async ({commit}, id) => {
    try {
      const {data} = await Axios.get('http://127.0.0.1:3001/api/profile/' + id)
      console.log(data)
      if (data) {
        commit('loadProfileOnce', data)
      } else {
        console.log('errorororo')
      }
    } catch (error) {
      throw error
    }
  }
}

const mutations = {
  loadProfileOnce: (state, payload) => {
    state.profile = payload
  }
}

const getters = {
  getOneProfile: state => {
    return state.profile
  }
}


В компоненте пишу так:

profile.vue

created () {
    this.$store.dispatch('loadProfileOnce', this.profileId)
  },
  computed: {
    ...mapGetters(['getOneProfile'])
  },


Приходит объект. Когда я обращаюсь к {{ getOneProfile}}, нормально выводит объект, а когда я вывожу свойство в шаблоне {{ getOneProfile.profile.name }}, вываливаются ошибки при рендринге. ПОНЯТНО, что дело в асинхронности. Я не понимаю, что я делаю не так, и как исправить, чтобы это заработало.
  • Вопрос задан
  • 332 просмотра
Решения вопроса 1
0xD34F
@0xD34F Куратор тега Vue.js
getOneProfile: state => {
  return state.profile
}

{{ getOneProfile.profile.name }}

То есть, у state.profile есть свойство profile? Типа, можно было бы и $store.state.profile.profile.name написать? Подозреваю, что profile всё-таки лишний. Ну и чтобы не пытаться выводить данные, которых пока нет, используйте условный рендеринг:

<КакойТоКомпонент v-if="данные">

UPD. Вынесено из комментариев:

Я думал, нужно делать какой то лоадер, пока данные идут?

Ну сделайте:

<КакойТоКомпонент v-if="данные" />
<ИндикаторЗагрузки v-else />
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@bagzon
Backend PHP, NodeJs, JS
{{ getOneProfile.profile.name }}

getOneProfile возвращает уже profile, может в этом проблема? попробуй {{ getOneProfile.name }}

К тому же попробуй vue инпектором посмотреть что у тебя в state лежит в момент обращения
Ответ написан
Вам просто надо указать Vue чтобы он подождал. Т.е. сделать created асинхронной.
async created () {
   await this.$store.dispatch('loadProfileOnce', this.profileId)
  },
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы