nastya_zholudeva
@nastya_zholudeva

Почему шина событий не слышит событие?

Есть 2 независимы страницы. По клику на кнопку на одной странице
//search.vue
<html><button @click="showSelectedCompanies">ПОСМОТРЕТЬ</button> </html>
<script>
import {bus} from '../../bus'

export default {
showSelectedCompanies () {
      this.items = this.items.filter(e => this.selectedCompaniesId.includes(e.id))
      console.log('this.itemsSearch', this.items)
      bus.$emit('selectedCompanies', this.items)
      this.$router.push({path: 'selected'})
    },
}
<script>

Массив this.items должен быть передан на вторую страницу
//Selected.vue
<script>
import {bus} from '../../bus'

export default {
mounted () {
    bus.$on('selectedCompanies', (data) => {
      console.log('data', data)
      this.items = data
      console.log('this.items', this.items)
    })
  },
  beforeDestroy () {
    bus.$off('selectedCompanies')
  }
}
</script>

Консоль распечатывает массив, который подготовлен для передачи при клике, но, то, что должно быть распечатано при прослушивании этого события - нет
5b2ff51820842400705293.png
Интересно то, что в vue devtools это событие с нужным заполненным массивом есть
5b2ff5472453f684050884.png
Что может быть не так?

P.S. На странице Search слушаю другое событие и все нормально
  • Вопрос задан
  • 252 просмотра
Решения вопроса 2
kulakoff
@kulakoff Куратор тега Vue.js
Vue.js developing
Видимо компонент куда вы отправляете событие не существует или подписа в нем не успела произойти.
Ответ написан
0xD34F
@0xD34F Куратор тега Vue.js
Возможная причина номер раз - в тот момент, когда вы делаете emit события, отсутствует экземпляр компонента, где вы пытаетесь его слушать.

Возможная причина номер два:

bus.$off('selectedCompanies')

Толково придумано. Давайте представим, что создаётся два... нет, лучше пять экземпляров компонента. Затем один удаляется. Вопрос - сколько после этого останется обработчиков события selectedCompanies? Думаете, что четыре? А вот и нет - ни одного. Надо всё-таки указывать, какой именно обработчик вы удаляете.

Наконец, возможная причина номер три:

Есть 2 независимы страницы.

Очень надеюсь, вы подразумеваете не разные вкладки/окна браузера.
Если всё-таки да...

...ну, поздравляю - чего-то вы в этой жизни не понимаете, от слова совсем. Нет реакции на событие потому, что шин у вас две - и ничего они друг о друге не знают. В этом случае вам нужна не шина, а надо как-то пересылать информацию между вкладками. Для этого можно использовать localStorage (есть плагины для vuex под это дело, можете погуглить), или BroadcastChannel.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы