javascript - Vue.js "emit event"不要冒泡到父元素和祖父元素

标签 javascript vue.js events event-handling event-bubbling

我想发出 一个自定义事件,从孙元素通过子元素到达父元素。但它不起作用。即使直接在父元素或子元素上触发事件也不起作用。

<div id="example-app" >
   <parent>
      <child>
         <grandchild></grandchild>
      </child>
   </parent>
</div>

这里是组件代码:

Vue.component('parent', {
    template: ` <div @testevent="test" style="padding: 10px; background-color: red; border: 1px solid black;">
                    <button @click="$emit('testevent')">Parent Button</button>
                    <button @click="test">Triggger Test Manueally</button>

                    <slot ></slot>
                </div>`,
    methods: {
        test () {
            alert('Test ok')
        }
    }
})

Vue.component('child', {
    template: ` <div style="padding: 10px; margin: 5px; background-color: green; border: 1px solid black;">
                    <button @click="$emit('testevent')">Child Button</button><br>
                    <slot></slot>
                </div>`
})

Vue.component('grandchild', {
    template: `<div style="padding:10px; margin: 5px; background-color: white; border: 1px solid black;">
                <button @click="$emit('testevent')">Grandchild Button</button>
                </div>`
})

new Vue({
    el: '#example-app',
})

最佳答案

你可以尝试这样的事情:

Vue.component('parent', {
    template: ` <div style="padding: 10px; background-color: red; border: 1px solid black;">
                    <button @click="$emit('testevent')">Parent Button</button>
                    <button @click="test">Triggger Test Manueally</button>

                    <slot ></slot>
                </div>`,
    methods: {
        test () {
            alert('Test ok')
        }
    },
    mounted: function() {
      this.$on('testevent', () => {
        this.test()
      })
    }
})

Vue.component('child', {
    template: ` <div style="padding: 10px; margin: 5px; background-color: green; border: 1px solid black;">
                    <button @click="$emit('testevent')">Child Button</button><br>
                    <slot></slot>
                </div>`,
    mounted: function() {
      this.$on('testevent', () => {
        this.$parent.$emit('testevent')
      })
    }
})

Vue.component('grandchild', {
    template: `<div style="padding:10px; margin: 5px; background-color: white; border: 1px solid black;">
                <button @click="$parent.$emit('testevent')">Grandchild Button</button>
                </div>`
})

new Vue({
    el: '#example-app',
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<div id="example-app" >
   <parent>
      <child>
         <grandchild></grandchild>
      </child>
   </parent>
</div>

关于javascript - Vue.js "emit event"不要冒泡到父元素和祖父元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59510198/

相关文章:

javascript - 如何在 Vue.js 中使用图像作为按钮?

javascript - dom 之外的节点选择和操作(jQuery 的技巧是什么?)

javascript - Nuxt mixin - 属性或方法未在实例上定义但在渲染期间被引用

javascript - 如何访问 fetch() Hook 内的 Nuxt 上下文?

javascript - 从提供给 Vue (Vue.js 3) 的 Vuex 访问实例/服务

javascript - 在网络应用程序上存储图像的最佳方式是什么?

javascript - 多维数组 JavaScript

c# - 避免在 C# 中重复订阅事件

events - Blazor 绑定(bind)行为不一致

javascript - event.preventDefault() 与 return false(无 jQuery)