vuex getter не обновляется на другом компоненте в зависимости от времени - PullRequest
0 голосов
/ 18 ноября 2018

Мое приложение использует

  • axios для получения информации о пользователе с внутреннего сервера
  • vuex для хранения пользователей
  • vue-router для навигации по странице каждого пользователя

В App.vue отправка выборки

export default {                                                                   
  name: 'app',                                                                     
  components: {                                                                    
    nav00                                                                          
  },                                                                               
  beforeCreate() {                                            
    this.$store.dispatch('fetchUsers')                               
  }                                                                                
}                                                                                  

В store.js,users - это объект с pk (первичным ключом) для информации пользователя.

export default new Vuex.Store({                                                 
  state: {                                                                      
    users: {},     
  },
  getters: {
    userCount: state => {                                                       
      return Object.keys(state.users).length                                    
    } 
  },
  mutations: { 
    SET_USERS(state, users) { 
      // users should be backend response 
      console.log(users.length)                                                                   
      users.forEach(u => state.users[u.pk] = u) 
  actions: { 
    fetchUsers({commit}) { 
      Backend.getUsers()                                   
        .then(response => {                             
          commit('SET_USERS', response.data)                       
        })                                       
        .catch(error => {                        
          console.log("Cannot fetch users: ", error.response)                   
        }) 
})

Здесь Backend.getUsers() - это вызов axios.

В другом компоненте, который отображается на /about в vue-router он просто отображает userCount через геттер.

Теперь поведение приложения зависит от времени.Если я сначала зайду / и подожду 2-3 секунды, а затем перейду к /about, userCount будет отображаться правильно.Однако, если я зайду /about напрямую или сначала займусь / и быстро перейду к /about, userCount будет 0.Но в консоли все равно отображается правильное количество пользователей (из журнала SET_USERS).

Что мне здесь не хватало?Разве получатель магазина не должен увидеть обновление в users и снова отобразить HTML-дисплей?

1 Ответ

0 голосов
/ 18 ноября 2018

Поскольку это объект, Vue не может обнаружить изменения свойств, и он даже менее реагирует, когда дело доходит до вычисляемых свойств.

Скопировано из https://vuex.vuejs.org/guide/mutations.html:

При добавлении новых свойствдля объекта вы должны либо:

Use Vue.set(obj, 'newProp', 123), либо

Заменить этот объект на новый.Например, используя синтаксис распространения объекта, мы можем написать его так:

state.obj = { ...state.obj, newProp: 123 }
...