【问题标题】:Event from a child component isn't detected未检测到来自子组件的事件
【发布时间】:2017-08-14 16:15:55
【问题描述】:

基于 Vue 上的树视图示例 (https://vuejs.org/v2/examples/tree-view.html),我将其代码重组如下: 在父组件中

<ul>
      <item class="item" :model="treeData" v-on:changeType="changeTypeEvent"></item>
</ul>
...
<script>
  ...
    methods: {
       changeTypeEvent: function () {
       console.log('Incoming event ' )
    }
 ...
</script>

在其子组件中,

<li>
  <div :class="{bold: isFolder}" @click="toggle" @dblclick.once="changeType">
        {{model.name}}
    <span v-if="isFolder">[{{open ? '-' : '+'}}]</span>
  </div>
  <ul v-show="open" v-if="isFolder">
    <item class="item" v-for="model in model.children" v-bind:key="model.name" :model="model">
        </item>
    <li class="add" @click="addChild">+</li>
  </ul>
  </li>
  ...
<script>
export default {
  name: 'item',
  props: {
    model: Object
  },
  data: function () {
    return {
      open: false
    }
  },
  computed: {
    isFolder: function () {
      return this.model.children &&
       this.model.children.length
    }
  },
  methods: {
    toggle: function () {
      if (this.isFolder) {
        this.open = !this.open
      }
    },
   changeType: function () {
    if (!this.isFolder) {
      console.log('Double click ' + this.model.name)
      this.$emit('changeType')
    }
  },
 }
}
</script>

由于某种原因,在父组件中未检测到该事件。我有一个具有相同结构的工作代码。为什么在这种情况下它不起作用?

【问题讨论】:

    标签: vue.js vuejs2 vue-component


    【解决方案1】:

    Html 属性名称不区分大小写 (https://www.w3.org/TR/2012/WD-html-markup-20120315/documents.html#case-insensitivity),因此 Vue 将父级上的事件侦听器从模板的 pascal-case changeType 转换为 kebab-case change-type

    <ul>
          <item class="item" :model="treeData" v-on:change-type="changeTypeEvent"></item>
    </ul>
    

    Vue 文档:https://vuejs.org/v2/guide/components.html#camelCase-vs-kebab-case

    【讨论】:

    • 请分享子组件的代码 :) 您是否尝试为您的活动使用不同的名称?
    • @FranzSkuffka 我没有修改子组件代码,只是将 v-on:changeType 切换为 v-on:change-type
    • 感谢您的信息。我尝试在不使用任何大写字母的情况下重命名事件。问题仍然存在。我看看我的其他 Modal 工具。事件名称包含一个大写字母。它不在父母的烤肉串案例中。这样可行。我会用更多细节更新我的问题。
    • 请提供更多代码。请注意,您只能监听来自 direct 子组件的事件。孙子不能触发事件。
    猜你喜欢
    • 1970-01-01
    • 2021-04-28
    • 1970-01-01
    • 2013-04-20
    • 2021-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多