Vue.js - 从孙插槽组件发出的事件没有将 $emit 事件冒泡到父组件

Vue.js - Emit from grandchild slot component didn't bubble $emit event to parent

我计划并制作了一个模态,然后创建了一个按钮来关闭模态 window。 我想使用 $emit 作为按钮事件来更改 isHomeDialog 的值。
但是,$emit 的活动没有传送到 "Home.vue"

Home.vue

<template>
  <div>
    <ReviewDialog
      :is-open="isHomeDialog"
      @close="closeEvent()/>
  </div>
</template>

<script>
import ReviewDialog from '@/components/popup/dialog/ReviewDialog';
</script>

export default {
  name: 'Home',
  components: {
    ReviewDialog
  },
  data () {
    return {
      isHomeDialog: true
    };
  },
  methods: {
    closeEvent () {
      console.log('close');
      isHomeDialog = false;
    }
  }
};

BaseDialog.vue

<template>
  <div v-show="isOpen">
    <div class="mask">&nbsp;</div>
    <div class="content">
      <button
        class="close"
        @click="$emit('close')">&nbsp;</button>

      <slot/>

    </div>
  </div>
</template>
<script>
export default {
  props: {
    isOpen: {
      type: Boolean,
      required: true
    }
  }
};

Reviewdialog.vue

<template>
  <BaseDialog
    url="@/components/popup/dialog/BaseDialog"
    id="review-dialog"
    :is-open="isOpen"
    :header-text="'REVIEW'">

    <div class="warp">
      <p>
        test
      </p>
    </div>
  </BaseDialog>
</template>

<script>
import BaseDialog from '@/components/popup/dialog/BaseDialog';

export default {
  components: {
    BaseDialog
  },
  props: {
    isOpen: {
      type: Boolean,
      default: false
    }
  }
</script>

首页
└ BaseDialog
└ 评论对话框

在上面的结构中,我尝试用$emit向BaseDialog和ReviewDialog发送请求,但是没有投递到Home。 除了用 $root.$emit 请求它之外,还有什么方法可以将 $ emit 发送到它的父组件吗?

由于双向绑定在 Vue2 中已被弃用 + child 不能直接改变 props

可能是另一种方法 custom component with v-model

我把参考资料放在下面:

BaseDialog 向其父 ReviewDialog 发出 close 事件,后者未监听它。所以你需要在 ReviewDialog 中监听,并​​重新发送事件到 Home:

<BaseDialog
    url="@/components/popup/dialog/BaseDialog"
    id="review-dialog"
    :is-open="isOpen"
    :header-text="'REVIEW'"
    @close="$emit('close')"> <-- This line is new -->

另一种方法是让 ReviewDialog 传递所有的监听器:

<BaseDialog
    url="@/components/popup/dialog/BaseDialog"
    id="review-dialog"
    :is-open="isOpen"
    :header-text="'REVIEW'"
    v-on="$listeners"> <-- This line is new -->