javascript - 为什么Vue事件不向上传播?

标签 javascript vuejs2

当从子组件发出事件时,为什么包含该事件的应用程序没有捕获该事件?请参阅下面的代码了解一个非常基本的示例。单击其中一个链接时,我希望出现“应用程序”警报,然后是“组件”警报。相反,它只提供“组件”。

Vue.component('list-item', {
  template: '<li><a href="#" v-on:click.prevent="itemClick">click</a></li>',
  methods: {
    itemClick() {
      this.$emit('item-event');
      alert('component');
    }
  }
});

new Vue({
  el: "#app",
  data: {
    items: [
      'a', 'b', 'c'
    ]
  },
  methods: {
    itemClick: function() {
      alert('app');
    }
  }
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>

<div id="app" v-on:item-event="itemClick">
  <ol>
    <li is="list-item" v-for="item in items"></li>
  </ol>
</div>

如果这不是 child 与 parent 沟通的正确方式,那什么才是?

最佳答案

Vue 事件不会在 DOM 树中冒泡。您需要监听发出事件的 list-item 组件上的事件:

Vue.component('list-item', {
  template: '<li><a href="#" v-on:click.prevent="itemClick">click</a></li>',
  methods: {
    itemClick() {
      this.$emit('item-event');
      alert('component');
    }
  }
});

new Vue({
  el: "#app",
  data: {
    items: [
      'a', 'b', 'c'
    ]
  },
  methods: {
    itemClick: function() {
      alert('app');
    }
  }
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>

<div id="app">
  <ol>
    <li is="list-item" v-for="item in items" v-on:item-event="itemClick"></li>
  </ol>
</div>

关于javascript - 为什么Vue事件不向上传播?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53899667/

相关文章:

javascript - 如何访问 webdriver 中添加的插件

javascript - 在 Vue.js 2.0 中将数组传递给组件

javascript - 我还应该在 VueJS 中使用 jQuery 来制作动画吗?

vuejs2 - 在 Vuejs 中,是否可以将模型绑定(bind)到按钮?

vue.js - Vuejs 嵌套插槽 : how to pass slot to grandchild

javascript - 将导航中的下拉子菜单对齐到与其父级相同的高度

javascript - 仅针对选中的复选框显示按钮。 js

javascript - JQuery Mobile Panel Widget – 打开可折叠列表会导致在扩展到页面高度之外时跳转滚动到页面 div 的底部。为什么?

javascript - 如何将代码添加到 &lt;script&gt; &lt;/script&gt; 中

laravel - vue.js 2.0 在 laravel 5.3 中动态加载组件