Выполнение итерации по объекту хранилища Vuex

#vue.js #vue-component #vuex #vuex-modules

#vue.js #vue-компонент #vuex #vuex-модули

Вопрос:

Я новичок в Vue.js и Vuex и опробование образца приложения. Это сценарий-

У меня есть модуль хранилища для уведомлений, который хранит уведомления в объекте с заданным именем в качестве его ключа.

 {
  'message1': {
    type: 'info',
    message: 'This is an info message.',
    isShown: true,
  },
  'message2': {
    type: 'success',
    message: 'This is a success message.',
    isShown: true,
  },
  'message3': {
    type: 'error',
    message: 'This is an error message.',
    isShown: true,
  }
}
  

И это мой модуль Vuex, который обрабатывает уведомления-

 const state = {
  notifications: {},
};

const mutations = {
  setNotification(state, { message, type, name }) {
    state.notifications[name] = {
      message,
      type,
      isShown: true,
    }
  },
  removeNotification(state, name) {
    delete state.notifications[name];
  }
};

const actions = {
  async showNotification(context, options) {
    await context.commit('setNotification', options);
  },
  async removeNotification(context, name) {
    await context.commit('removeNotification', name);
  }
}

const getters = {
  isNotificationShown: (state, getters) => {
    return getters.getNotificationMessageList.length > 0;
  },
  getNotificationMessageList: state => {
    return state.notifications;
  },
}

export default {
  state,
  actions,
  mutations,
  getters,
}
  

И это мой компонент-

 <template>
  <div v-if="isShown">
    <div v-for="(notice, name, index) in notificationMessageList" :key="name">
      {{ index }} - {{ notice.type }} - {{ notice.message}}
    </div>
  </div>
</template>

<script>
export default {
  computed: {
    isShown() {
      return this.$store.getters.isNotificationShown;
    },
    notificationMessageList() {
      return this.$store.getters.getNotificationMessageList; 
    },
  },
};
</script>
  

Я проверил с помощью средства разработки Vue и обнаружил, что хранилище обновляется, как и компонент с уведомлениями, которые я передаю в хранилище. Но компонент не отображается. Но если я использую те же данные, жестко закодировав их в компоненте, это работает.

Я не уверен, что это правильный способ подключения хранилища Vuex к компоненту.

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

1. Не могли бы вы, пожалуйста, создать jsfiddle для этого?

Ответ №1:

Это проблема с реактивностью Vue. Вам необходимо обновить ссылку, чтобы сделать Vue реактивным. Вы можете использовать JSON.parse(JSON.stringify()) или использовать синтаксис ES6:

 const mutations = {
  setNotification(state, { message, type, name }) {
    state.notifications = {
      ...state.notifications,
      [name]: {
        message,
        type,
        isShown: true
      }
    }
  },
  removeNotification(state, name) {
    const newNotifications = {...state.notifications}
    delete newNotifications[name]
    state.notifications = newNotifications
  }
};