Vue JS从父组件不触发向子组件发出事件
Vue JS emit event to child component from parent component not triggering
我在 Nuxt JS 项目中工作。我有几个组件,其中一个名为 ComplianceOptoutRawText
的组件包含一个名为 ComplianceOptoutViaExternalService
的子组件,正是这个子组件让我使用 v-on
来监听 [=15] =] 来自 ComplianceOptoutRawText
的事件,因此我可以切换变量,但我在控制台日志中根本看不到它,需要知道我做错了什么并需要更改。
这是我的标记,包含所有合适的内容:
ComplianceOptoutRawText
<template>
<div>
<div>
<div class="tw-hidden md:tw-block tw-font-bold tw-mb-4">
<ComplianceOptoutViaExternalService>
<template #trigger>
<button @click="$emit('shown-optout-intent', true)" type="button">here</button>
</template>
</ComplianceOptoutViaExternalService>
</div>
</div>
</div>
</template>
然后是子组件本身:
ComplianceOptoutViaExternalService
<template>
<div>
<slot name="trigger"></slot>
<article v-show="wantsToOptOut" v-on:shown-optout-intent="hasShownOptoutIntent" class="tw-bg-white tw-p-4 md:tw-p-6 tw-rounded-xl tw-text-gray-800 tw-border tw-border-gray-300 tw-text-left tw-mt-4">
<validation-observer v-if="!didOptOut" ref="optoutServiceForm" key="optoutServiceForm" v-slot="{ handleSubmit }" tag="section">
<form>
...
</form>
</validation-observer>
</article>
</div>
</template>
<script>
export default {
data () {
return {
wantsToOptOut: false,
isOptingOut: false,
didOptOut: false
}
},
methods: {
/*
** User has shown opt out intent
*/
hasShownOptoutIntent (value) {
this.wantsToOptOut = !this.wantsToOptOut
}
}
}
</script>
请注意,我的子组件使用了一个插槽,这样我就可以根据需要在父组件中放置所有内容,但在它的核心,我有一个父组件发出一个值,然后通过 [=17 监听它=] 运行 hasShownOptoutIntent
方法。
但是我从按钮上看不到任何东西,即使我 console.log 这个。我错过了什么?
我正在对嵌入式组件做类似的事情,因此也许值得一试:
<button @click="$emit('update:shown-optout-intent', true)" type="button">here</button>
... 然后:
v-on:shown-optout-intent.sync="hasShownOptoutIntent"
顺便说一句,删除 v-on
并使用::shown-optout-intent
.
是安全的
我在 Nuxt JS 项目中工作。我有几个组件,其中一个名为 ComplianceOptoutRawText
的组件包含一个名为 ComplianceOptoutViaExternalService
的子组件,正是这个子组件让我使用 v-on
来监听 [=15] =] 来自 ComplianceOptoutRawText
的事件,因此我可以切换变量,但我在控制台日志中根本看不到它,需要知道我做错了什么并需要更改。
这是我的标记,包含所有合适的内容:
ComplianceOptoutRawText
<template>
<div>
<div>
<div class="tw-hidden md:tw-block tw-font-bold tw-mb-4">
<ComplianceOptoutViaExternalService>
<template #trigger>
<button @click="$emit('shown-optout-intent', true)" type="button">here</button>
</template>
</ComplianceOptoutViaExternalService>
</div>
</div>
</div>
</template>
然后是子组件本身:
ComplianceOptoutViaExternalService
<template>
<div>
<slot name="trigger"></slot>
<article v-show="wantsToOptOut" v-on:shown-optout-intent="hasShownOptoutIntent" class="tw-bg-white tw-p-4 md:tw-p-6 tw-rounded-xl tw-text-gray-800 tw-border tw-border-gray-300 tw-text-left tw-mt-4">
<validation-observer v-if="!didOptOut" ref="optoutServiceForm" key="optoutServiceForm" v-slot="{ handleSubmit }" tag="section">
<form>
...
</form>
</validation-observer>
</article>
</div>
</template>
<script>
export default {
data () {
return {
wantsToOptOut: false,
isOptingOut: false,
didOptOut: false
}
},
methods: {
/*
** User has shown opt out intent
*/
hasShownOptoutIntent (value) {
this.wantsToOptOut = !this.wantsToOptOut
}
}
}
</script>
请注意,我的子组件使用了一个插槽,这样我就可以根据需要在父组件中放置所有内容,但在它的核心,我有一个父组件发出一个值,然后通过 [=17 监听它=] 运行 hasShownOptoutIntent
方法。
但是我从按钮上看不到任何东西,即使我 console.log 这个。我错过了什么?
我正在对嵌入式组件做类似的事情,因此也许值得一试:
<button @click="$emit('update:shown-optout-intent', true)" type="button">here</button>
... 然后:
v-on:shown-optout-intent.sync="hasShownOptoutIntent"
顺便说一句,删除 v-on
并使用::shown-optout-intent
.