vue eventbus - $on 不会触发总线

vue eventbus - $on wont trigger the bus

我看过教程并阅读了论文,但我不明白为什么我的 eventbus 设置不起作用。

在main.js 我创建了一个 Vue

的新实例
/* create a eventbus*/
export const Bus = new Vue();

第 1 页

import { Bus } from "../main";

然后我有一个触发方法的点击事件

methods: {
    moveData(inValue) {
      let valueToSend = inValue;
      console.log("valueToSend");
      console.log(valueToSend);
      Bus.$emit("emitAlbumTitle", valueToSend);
    },
  },

并且 console.log 表明方法 moveData() 没有任何问题。

在第 2 页。 我试着听听 busemit。

import { Bus } from "../main";
  data() {
    return {
      id: this.$route.params.idAlbum,
      photoData: [],
      albumTitle: "",
    };
  },

created() 中尝试过,如您所见,我在那里进行了一些其他操作,例如 api 调用,但我认为这不应该影响它。

async created() {
    try {
      this.photoData = await CallApi.getPosts(url + this.id);
      this.number = this.photoData.length;
      Bus.$on("emitAlbumTitle", (data) => {
        this.albumTitle = data;
        console.log("in the $bus");
        console.log(data);
      });
    } catch (err) {
      this.error = err.message;
    }
  },

但是 Bus.$on 中的 console.logs 没有启动,所以 eventbus 永远不会启动? 我也试过 mounted() hook

mounted() {
  Bus.$on("emitAlbumTitle", (data) => {
   this.albumTitle = data;
    console.log("in the $bus");
    console.log(data);
  });
},

但结果相同。 我在这里错过了什么?

试试这个对我有用。单击按钮时,数据将显示在控制台中。
这是 main.js 文件。

import Vue from 'vue'
import App from './App.vue'
import vuetify from './plugins/vuetify';

Vue.config.productionTip = false
export const eventBus = new Vue();
new Vue({
  vuetify,
  render: h => h(App)
}).$mount('#app')

是App.vue个文件。

<template>
  <v-app>
    <div id="app">
      {{albumTitle}}
      <br>
      <button class="primary" @click="dataSend">send</button>
    </div>
  </v-app>
</template>

<script>
import {eventBus} from '@/main'
export default {
  name: "App",

  data: () => ({
    albumTitle: null
  }),
  created(){
   eventBus.$on("emitAlbumTitle", (data) => {
     this.albumTitle = data;
      console.log("in the $bus");
      console.log(data);
    });
  },
  methods: {
    dataSend(){
      eventBus.$emit("emitAlbumTitle", "some data")
    }
  },
};
</script>

问题是您的 Receiver 组件在您单击 link 之前不会创建,此时事件已经从 Sender 发出。

一个解决方案是将发出的事件延迟到下一个宏刻度(使用 setTimeout 没有延迟),因为 Receiver 组件将在当前宏刻度中创建:

export default {
  methods: {
    async emitValue() {
      // wait til next macro tick
      await new Promise(r => setTimeout(r));

      EventBus.$emit("string-send", this.sendString);
    },
  }
}

demo