【问题标题】:child component emit an custom event, but parent component's listener not triggered子组件发出自定义事件,但未触发父组件的侦听器
【发布时间】:2019-10-29 14:21:34
【问题描述】:

我在Vue中注册了一个子组件,子组件会发出自定义事件,但是父组件的监听器没有触发。

<template id="add-item-template">
<div class="input-group">
  <input @keyup.enter="addItem" v-model="newItem" >
  <span class="input-group-btn">
    <button @click="addItem" type="button">Add!</button>
  </span>
</div>
</template>

<div id="app" class="container">
  <h2>{{ title }}</h2>
  <add-item-component v-on:itemAdd="addAItem"></add-item-component>
</div>

Vue.component('add-item-component', {
  template: '#add-item-template',
  data: function () {
    return {
        newItem: ''
    };
  },
  methods: {
    addItem() {
      this.$emit('itemAdd');
      console.log("itemAdd In add-item-component");
    }
  }
});

new Vue({
  el: '#app',
  data: { 
    title: 'Welcome to Vue' 
  },
  methods: {
    addAItem: function () {
      console.log("In #app, addAItem()!");
    }
  }
});

“itemAdd In add-item-component”日志显示在控制台中,但“在#app 中,addAItem()!”不记录,#app 的方法 addAItem 没有被调用。

【问题讨论】:

    标签: javascript vue.js vuejs2


    【解决方案1】:

    问题是自定义事件不应该用 camelCase 命名。如果您查看控制台中的错误消息,它会告诉您:

    在组件中发出事件“itemadd”,但处理程序注册为“itemAdd”

    即使您使用 camelCase 命名该组件,它也会发出小写版本。重命名为全小写或 kebab-case 将解决此问题。

    在父模板中:

    <add-item-component @itemadd="addAItem">
    

    从子级发射:

    this.$emit('itemadd');
    

    这与 Evan You(Vue 创建者)here 进行了一些讨论

    【讨论】:

    • 你是对的。谢谢你的帮助!当我将事件名称都更改为小写时,它可以工作。只是一个小问题,在我的chrome的开发者工具中,没有错误信息说名字不一致,我怎么才能看到错误信息?
    • 不客气。也许您的控制台没有显示默认的信息级别。检查输出区域上方控制台中的工具栏,在搜索框的右侧,有一个“级别”下拉菜单。将其设置为默认值或确保选中“警告”。
    • 输出区域上方有一个“级别”下拉菜单,“级别”下拉菜单左侧有一个“默认”。这两个字是灰色的,下拉菜单不能点击。我猜它已经设置为默认值了。
    • 尝试将此行添加到您的main.jsVue.config.productionTip = true
    • 好。现在,如您所说,出现警告:“[Vue 提示]:在 src/App.vue 的组件 中发出事件“itemadd”,但处理程序已为“itemAdd”注册。请注意,HTML 属性是大小写 -不敏感,并且在使用 in-DOM 模板时不能使用 v-on 来监听 camelCase 事件..." 非常感谢!
    猜你喜欢
    • 2015-12-18
    • 2020-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-19
    • 1970-01-01
    • 1970-01-01
    • 2021-01-14
    相关资源
    最近更新 更多