javascript - 使用 this.$root.$emit 调用事件总线

标签 javascript vue.js

我有一个简单的事件总线,可以更改页面上的样式并且它可以工作。使用事件总线的名称以及 $emit$on 调用事件总线:

EventBus.$on

EventBus.$emit('call-modal', { type: 'success' });

我怎样才能不使用 $on$emit 调用它,而可以使用 this.$root.$emit 调用它code> 以便我可以在其他所有组件中使用它?我尝试过,但目前不起作用,为什么?

这是我的 App.vue:

<template >
  <div id="app">
    <bankAccount>
    </bankAccount> 
    <div :class="['modal', `modal--type--${modalType}`]" v-show="showModal">
    <slot name="title">e</slot>
    <slot name="description"></slot>
    </div>
  </div>
</template>

<script>
import bankAccount from './components/bankAccount.vue'
import Vue from 'vue'
export const EventBus = new Vue()

export default {
  name: 'app',
  components: {
    bankAccount,
  },
  data() {
    return {
      showModal: false,
      modalType: 'default',
    }
  },
  created() {
    EventBus.$on('call-modal', obj => {
      this.showModal = true
      this.modalType = obj.type
    })
  },
}
</script>

<style>
.modal {
  height: 100px;
  width: 300px;
  border: solid gray 2px;
}

.modal--type--success {
  border-color: green;
}

.modal--type--danger {
  border-color: red;
  width: 100%;
}

.modal--type--warning {
  border-color: yellow;
  width: 100%;
}
</style>

还有我的组件:

<template>
  <div>
   <button class="pleeease-click-me" @click="callModal()">Click me</button>
  </div>
</template>

<script>
import { EventBus } from '../App.vue';


export default {
  name: 'bankAccount',
  data() {
    return {
      showModal: false
    }
  },
   methods: {
    callModal() {
      this.showModal = !this.showModal
     EventBus.$emit('call-modal', { type: 'success' });

    }
  }
}

</script>

<style scoped>

.modal {
  height: 100px;
  width: 300px;

}
</style>

最佳答案

您可以创建一个单独的 eventbus.js 文件并将其包含到您的所有组件中。这样,他们将使用相同的事件总线实例。 TL;DR:这里已经解释过:

https://alligator.io/vuejs/global-event-bus/

长一个:

使用以下内容创建一个 eventbus.js 文件:

import Vue from 'vue';
export const EventBus = new Vue();

然后包含它:

import { EventBus } from './event-bus.js';

然后使用它:

EventBus.$on("event", function(data){
    // do stuff with data
});

EventBus.$emit("event", data);

并且不要忘记删除销毁事件:

beforeDestroy {
     EventBus.$off("event");
}

关于javascript - 使用 this.$root.$emit 调用事件总线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57641696/

相关文章:

javascript - 隐藏输出文本区域中的 null 值和空值

javascript - 我正在尝试将值从数据库传递到js。但我收到了升压错误?

javascript - 'sort'方法在chrome环境和node环境有什么区别

javascript - 简单地尝试使用 <span> 字符来调用 javascript 函数来关闭下拉菜单

typescript - Vue Cli 3 typescript 。无法将 css/sass 导入 &lt;script&gt; block

vue.js - 发送带有授权 header 的 axios get 请求

javascript - 为什么开发人员偶尔会在 "SharedArrayBuffer" "Atomics"属性中添加 ".eslintrc.json"和 "globals"?

vue.js - 在 Vuetify Data iterators + Data tables 了解 `rows-per-page-items`,我可以设置默认页面吗?

php - 如何在一台服务器上使用 Vue.js 和 PHP?

javascript - 如何为 Nuxt.js 创建插件?