Vue.js-从子级插槽组件发出的事件并未使$ emit事件冒泡给父事件

时间:2020-04-24 08:55:18

标签: vue.js vuejs2 vue-component slot emit

我计划并制作了一个模态,然后创建了一个按钮以关闭模态窗口。 我想使用isHomeDialog作为按钮的事件来更改$emit的值。
但是,$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>

首页
Dialog BaseDialog
└ReviewDialog

在上述结构中,我尝试使用$ emit将请求发送到BaseDialog和ReviewDialog,但未将其传递到Home。 除了向$ root。$ emit请求以外,还有什么方法可以将$ emit发送到其父组件?

2 个答案:

答案 0 :(得分:0)

由于Vue2中不推荐使用双向绑定,因此子代无法直接更改道具

就像另一种方法custom component with v-model

我在下面提供了参考: vuejs update parent data from child component

答案 1 :(得分:0)

BaseDialog向其父close发送ReviewDialog事件,该事件没有监听它。因此,您需要收听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 -->