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"> </div>
<div class="content">
<button
class="close"
@click="$emit('close')"> </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 -->
我计划并制作了一个模态,然后创建了一个按钮来关闭模态 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"> </div>
<div class="content">
<button
class="close"
@click="$emit('close')"> </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 -->