Vue - не родительское детское общение

При чтении документа Vue Номера для родительского общения
Для практики я попытался построить пример, чтобы увидеть, работает ли он, ниже приведен мой код:
Я построил два компонента и попытался использовать шину экземпляра Vue для передачи сообщения от dudi-station к dudo-station во время нажатия, но это не работает.
Кто-нибудь может помочь? Спасибо!

Vue.component('dudi-station', {
 template: '<div @click="sentMsg">{{dudiMsg}}</div>',
 data: function() {
   return {
     dudiMsg: 'Dudi!!',
    }
  },
  methods: {
   sentMsg: function() {
     bus.$emit('callout', this.dudiMsg);
    },
  }
});

Vue.component('dudo-station', {
 template: '<div>{{dudoMsg}}</div>',
 data: function() {
   return {
     dudoMsg:'',
    }
  },
 created: function() {
   bus.$on('callout', function(value) {
     this.dudoMsg = value;
      console.log(value)
    });
  }
});

var bus = new Vue();
new Vue({
 el: '#app',
})
<script src="https://unpkg.com/vue"></script>
<div id="app">
  <dudi-station></dudi-station>
  <dudo-station></dudo-station>
</div>

1 ответ

Потому что в этом утверждении: bus.$on('callout', function(value) { this.dudoMsg = value; это не значит твой вью инстанс. Вам нужно использовать функцию стрелки, чтобы убедиться, что 'this' означает экземпляр vue. Как ниже:

Vue.component('dudi-station', {
 template: '<div @click="sentMsg">{{dudiMsg}}</div>',
 data: function() {
   return {
     dudiMsg: 'Dudi!!',
    }
  },
  methods: {
   sentMsg: function() {
     bus.$emit('callout', this.dudiMsg);
    },
  }
});

Vue.component('dudo-station', {
 template: '<div>{{dudoMsg}}</div>',
 data: function() {
   return {
     dudoMsg:'',
    }
  },
 created: function() {
   bus.$on('callout',value => {
     this.dudoMsg = value;
      console.log(value)
    });
  }
});

var bus = new Vue();
new Vue({
 el: '#app',
})
<script src="https://unpkg.com/vue"></script>
<div id="app">
  <dudi-station></dudi-station>
  <dudo-station></dudo-station>
</div>

Используйте стрелочную функцию в качестве обработчика событий при получении сообщения в компоненте от другого компонента. Это поможет вам с объемом ключевого слова "это".

bus.$on('callout', function(value) {
        this.dudoMsg = value;
      console.log(value)
    });

вместо этого используйте его, как показано ниже

bus.$on('callout', (value) => {
        this.dudoMsg = value;
      console.log(value)
    });
Другие вопросы по тегам