vue 中的全局组件通信是否正确?

is it correct global component communication in vue?

我为全局制作模态弹出组件myPopup.vue

并将其导入 App.vuemain.js 我将其用于全局,定义一些对象 Vue.prototype

Vue.prototype中修改弹出方法 例如,"show" 或 "hide",任何其他。

但我认为这可能是反模式.. 我想找到更多最佳实践。

在App.vue

<div id="app>
  <my-popup-component></my-popup-conponent>
  <content></content>
</div>

main.js

...
Vue.prototype.$bus = new Vue(); // global event bus
Vue.prototype.$popup = {
  show(params) {
    Vue.prototype.$bus.$emit('showPopup', params);
  },
  hide() {
    Vue.prototype.$bus.$emit('hidePopup');
  }
}

Vue.component('my-popup-component', { ... });
...

myPopup.vue

....
export default {
...

  created() {
    this.$bus.$on('showPopup', this.myShow);
    this.$bus.$on('hidePopup', this.myHide);
  }
...

需要弹出-component.vue

methods: {
  showPopup() {
    this.$popup.show({
      title: 'title',
      content: 'content',
      callback: this.okcallback
    }); 
  }
}

看起来效果不错,但我不知道这是否正确。 还有其他办法吗?

阅读您的解决方案时我感到非常惊讶,但如果您觉得它简单且有效,为什么不呢?

我会这样做:

  • 在状态中添加一个布尔值属性(或显示弹出窗口所需的任何数据),反映弹出窗口的显示
  • 使用 App.vue 中的 mapState 将反应式布尔值引入组件
  • 使用 v-if 或在 App.vue 模板中显示,在弹出声明中
  • 创建一个 'showPopup' 采用布尔值并相应地更新状态的突变
  • 随时随地调用突变show/hide弹出窗口

这将遵循 vue 模式。状态中的任何东西,ui 组件反映状态,突变改变状态。

您的解决方案可以,但是它不遵循 vue 框架,例如 vue 调试工具在您的情况下将毫无用处。我认为最好在一个应用程序中拥有最少数量的模式,以便维护,将其提供给其他人等等。

您以某种方式尝试创建全局组件,您可能希望在不同的项目中使用它。

这是我认为我会这样做的方式 -

如何重用模态对话框,而不是创建 3 个单独的对话框

创建一个单独的 modal 组件,假设 - commonModal.vue.

现在在你的 commonModal.vue 中,接受单身 prop,比如说 data: {}

现在在 commonModalhtml 部分

<div class="modal">
  <!-- Use your received data here which get received from parent -->
  <your modal code />
</div>

现在将 commonModal 导入到 consuming/parent 组件。在父组件中创建数据 属性,比方说 - isVisible: false,并为要在 modal 中显示的 data 计算 属性 比方说 modalContent.

现在这样使用

<main class="foo">
   <commonModal v-show="isVisible" :data="data" />
   <!-- Your further code -->
</main>

以上将帮助你 re-use 模态,你只需要从父组件发送 data

我怎么知道触发了哪个模态对话框?

只需验证 isVisible 属性 即可检查 modal 是否打开。如果 isVisible = false 那么你的模式不可见并且 vice-versa

我的全局对话框组件将如何通知其父组件其当前状态

现在,您可能会想如何关闭您的模式并让父组件知道它。 单击按钮触发 closeModal

创建一个方法 - closeModal 并在 commonModal 组件内部和 emit 一个事件。

closeModal() { 
  this.$emit('close-modal')
}

现在这将发出一个可以被消费组件侦听的自定义事件。

因此在您的父组件中只需使用此自定义事件,例如关注并关闭您的模态

<main class="foo">
  <commonModal v-show="isVisible" :data="data" @close- modal="isVisible = false"/>
  <!-- Your further code -->
</main>