Как вы используете автобус для передачи обновлений в представление в компоненте Vue?

Прослушивайте пользовательские события для шины в компоненте b. Однако после отправки событий в компоненте a он обращается к компоненту b. функция прослушивания компонента b выполняется, но msg функции данных не обновляется

Пожалуйста, не говорите Vuex.

Соответствующий код основан на Vue CLi3.

Вот код: Компонент A:

    <template>
      <div>
          Component A
          <button @click="sendMsg">pushB</button>
      </div>
    </template>
    <script>
    import bus from './bus'
    export default {
        methods: {
            sendMsg() {
                bus.$emit('send', 'hello Component B')
                this.$router.push('/bbb')
            }
        }
    }
    </script>

компонент B :

<template>
    <div>
        <p>component B:{{ msg }}</p>
    </div>
</template>
<script type="text/javascript">
import  bus  from './bus'
export default {
    data () {
        return {
            msg: 'bbb'
        }
    },
    mounted () {
        bus.$on('send', data => {
            console.log(data)
            console.log(this)
            this.msg = data
        })    
    } 

}
</script>

bus.js

import Vue from 'vue';
export default new Vue()

роутер :

const aaa = () => import('@/components/demo/bus/a')
const bbb = () => import('@/components/demo/bus/b')
export default new Router({
  routes: [{
      path: '/aaa',
      component: aaa
    },
    {
      path: '/bbb',
      component: bbb
    }]
})

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

Вы можете мне помочь?

Если возможно, я бы хотел глубоко понять слово «автобус».


person BaiClassmate Xiao    schedule 25.10.2019    source источник
comment
Вероятно, потому что вы подключаете слушателя, когда компонент B равен mounted, это означает, что он сможет прослушивать событие только тогда, когда он (компонент B) смонтирован. Это не тот случай, когда вы нажимаете эту pushB кнопку на компоненте A, поскольку компонент B еще не смонтирован из-за перехода маршрута.   -  person Abhishek Gupta    schedule 25.10.2019
comment
Когда вы генерируете подобные события, ваши компоненты должны быть родительскими и дочерними. Если они не входят одно в другое, и вы по-прежнему хотите, чтобы они обменивались данными (и вы не хотите использовать vuex), у вас может быть другой экземпляр Vue, который должен быть реализацией шины событий.   -  person equi    schedule 25.10.2019
comment
@equi Я думаю, что OP уже имеет экземпляр Vue для шины и не использует this.$emit, но bus.$emit, где bus - другой экземпляр Vue.   -  person Abhishek Gupta    schedule 25.10.2019
comment
@AbhishekGupta Спасибо за ваш комментарий, преобразование маршрутизации, на что мне нужно обратить внимание?   -  person BaiClassmate Xiao    schedule 25.10.2019
comment
В app.js / main.js window.bus = new Vue (); Не нужно помещать его в другой файл js   -  person Renato Manalili    schedule 25.10.2019
comment
@BaiClassmateXiao Если вы хотите передавать данные во время переходных маршрутов, рассмотрите возможность использования параметров запроса. Таким образом, даже если я перезагружу на /bbb, ваше приложение все равно будет работать, поскольку сообщение не является частью параметров запроса и не находится в состоянии памяти.   -  person Abhishek Gupta    schedule 25.10.2019
comment
@AbhishekGupta Да, я думал об этом раньше, но я хочу посмотреть, можно ли реализовать автобусную связь   -  person BaiClassmate Xiao    schedule 25.10.2019
comment
@AbhishekGupta Если страница перезагружается, обратный вызов связи по шине компонента b для a является недопустимым   -  person BaiClassmate Xiao    schedule 25.10.2019


Ответы (2)


Это будет работать только в том случае, если и компонент A, и компонент B присутствуют на странице во время передачи. Из кода кажется, что вы испускаете значение из компонента A, а затем переходите к компоненту B и ожидаете там значения.

То, что вы делаете, - это что-то вроде удара по мячу, а затем бега за ним, а затем взятия его только для того, чтобы обнаружить, что мяч исчез. Вам нужен другой человек, уже присутствующий в этом месте и подбирающий мяч.

Решением в этом случае может быть установка значения в localstorage, переход к другому маршруту, а затем чтение значения из localstorage.

Если значение, которое вам нужно передать, является простым значением, вы можете просто передать его в строке запроса, а затем прочитать из параметров $ router в компоненте B.

person Vijay Joshi    schedule 16.01.2020

Ваш код не будет работать должным образом, так как вы меняете маршрут после отправки события из Компонента A. Поэтому его не может поймать Компонент B.

Вы можете сохранить измененное значение при смешивании поищите здесь миксины или используйте localstorage. И вы также можете использовать строку запроса, как указано в предыдущем ответе

person Nipun Jain    schedule 17.01.2020