Vuex не может прочитать свойство после обновления страницы

#javascript #html #css #typescript #vue.js

Вопрос:

У меня есть Navbar компонент, когда я использую в нем значения из магазина Vuex. Перед входом в каждый маршрут я запускаю отправку из vuex, как здесь:

 router.beforeEach((to, from, next) => {
   //...
   store.dispatch("updateUserData"); 
   next();
});
 

мой магазин:

 const actions = {
  updateUserData({ commit }) {
    UserService.getUserData().then(
      (response) => {
        commit("updateUserState", response.data);
      },
      (error) => {}
    )
  },
}

const mutations = {
  updateUserState: function(state, user) {
    state.user = user;
  },
}

const getters = {
  getUser: (state) => {
    return state.user;
  }
}
 

кроме того, в моем Navbar компоненте у меня есть это:

   computed: {
    currentUser() {
      return this.$store.getters.getUser;
    }
  },
 

и используйте это значение, как здесь:

 <p style="border-left: 1px solid black" class="navIcon pl-4 py-1">
   {{ currentUser.firstName }} {{ currentUser.lastName }}
</p>
 

и теперь проблема, когда я открываю страницу, где это navbar используется, моя консоль и компонент работают хорошо, все в порядке, и у меня есть правильная визуализация представления, но после обновления страницы у меня все еще есть правильные данные о представлении, но моя консоль выдает мне эту ошибку:

 vue.esm.js?a026:628 [Vue warn]: Error in render: "TypeError: Cannot read property 'firstName' of null"

found in

---> <Navbar> at src/layouts/Navbar.vue
       <App> at src/App.vue
         <Root>
warn @ vue.esm.js?a026:628
vue.esm.js?a026:1897 TypeError: Cannot read property 'firstName' of null
 

может кто-нибудь сказать мне, что здесь не так? Спасибо за любую помощь!

Ответ №1:

Мне кажется, что ваше действие асинхронно, и данные могут быть недоступны получателю при визуализации вашего компонента.

Вы можете попробовать превратить свое действие в действие asyn, которое возвращает обещание, и подождать, пока оно разрешится, beforeEach прежде чем звонить next .

Попробуйте отладить приложение после обновления. Посмотрите в хранилище vue, запишите значение текущего пользователя в компоненте mount и т. Д…

Комментарии:

1. можете ли вы показать пример использования асинхронности здесь?