【问题标题】:Vue.js custom event namingVue.js 自定义事件命名
【发布时间】:2017-07-15 11:32:43
【问题描述】:

我有两个组件,一个包含另一个。

当我从孩子触发事件时,我无法在父母那里收到它。

子组件

this.$emit('myCustomEvent', this.data);

父组件

<parent-component v-on:myCustomEvent="doSomething"></parent-component>

但是,当我在两个地方都将事件名称更改为 my-custom-event 时,它可以正常工作。

Vue 以某种方式转换事件名称?或者可能是什么问题? 我阅读了docs 关于组件命名约定的内容,但没有与事件命名相关的内容

【问题讨论】:

    标签: vue.js vuejs2 vue-component


    【解决方案1】:

    Vue.js 不仅会转换 xml 标签(组件名称),还会转换属性,所以当您生成事件时

    $emit('iLikeThis')

    您必须将其处理为:

    v-on:i-like-this="doSomething"

    来自文档:

    注册组件(或props)时,可以使用kebab-case, camelCase 或 TitleCase。 ...

    不过,在 HTML 模板中,您必须使用 kebab-case 等价物:

    【讨论】:

    • 不工作。 Vue 不会将 camelCase 转换为 kebab ...但是如果我以 kebab 样式发出事件并以 kebab 样式收听它,它就可以工作。
    • same here.. 这似乎不适用于事件(不再)。使用 v2.4.2
    • 这不是一个wiki,而是一个问题的答案,它是有效且正确的。将文档用于...新功能 @ssc-hrep3 的文档。
    • 这里有一个文档链接,明确指出上述内容不起作用:vuejs.org/v2/guide/components-custom-events.html#Event-Names
    • 这不适用于自定义事件命名
    【解决方案2】:

    对于自定义事件,最安全的选择是只使用一个小写的事件名称,所有这些事件名称都拼在一起。目前,即使是 kebab-case 也会有问题。

    this.$emit('mycustomevent', this.data);
    

    然后,在父组件中,随意绑定到驼峰式函数

    <parent-component v-on:mycustomevent="doSomething"></parent-component>
    

    它有点笨拙,但它有效。

    Source(表示 kebab-case 也不起作用)

    【讨论】:

    【解决方案3】:

    建议始终使用kebab-case 来命名自定义事件。 小写事件,按照@KoriJohnRoys 的建议,全部拼凑在一起也可以,但更难阅读。事件命名不建议使用camelCase

    official documentation of Vue.JS 在事件名称主题下声明如下:

    事件名称

    与组件和道具不同,事件名称不提供任何自动大小写转换。相反,发出事件的名称必须与用于侦听该事件的名称完全匹配。例如,如果发出驼峰式事件名称:

    this.$emit('myEvent')
    

    听 kebab-cased 版本没有效果:

    <my-component v-on:my-event="doSomething"></my-component>
    

    与组件和道具不同,事件名称永远不会用作 JavaScript 中的变量或属性名称,因此没有理由使用 camelCase 或 PascalCase。此外,DOM 模板中的 v-on 事件侦听器将自动转换为小写(由于 HTML 不区分大小写),因此 v-on:myEvent 将变为 v-on:myevent - 使 myEvent 无法侦听。

    出于这些原因,我们建议您始终使用 kebab-case 作为事件名称。

    【讨论】:

    • @Gjaa 我刚刚在 Vue 2.6.10 中重新测试了它,它的行为仍然相同。你可能在其他地方有问题。您能否在 StackOverflow 上提供更多信息或提出新问题?
    • 我也必须使用 kebab case 发出我的事件才能使其工作,this.$emit('my-event')。在我的$emit 上使用骆驼皮套不起作用:耸耸肩:
    • 建议始终使用 kebab-case 来命名自定义事件。 使用 camelCase 将不起作用。
    【解决方案4】:

    除了@ssc-hrep3关于kebab-case的点

    .sync 的文档建议使用 update:myPropName 模式

    【讨论】:

      猜你喜欢
      • 2018-12-25
      • 2020-05-15
      • 2019-03-21
      • 2020-02-02
      • 2023-03-21
      • 2011-06-10
      • 2017-06-30
      • 1970-01-01
      • 2021-04-22
      相关资源
      最近更新 更多