Vue.js 自定义事件命名
Posted
技术标签:
【中文标题】Vue.js 自定义事件命名【英文标题】:Vue.js custom event naming 【发布时间】:2017-07-15 11:32:43 【问题描述】:我有两个组件,一个包含另一个。
当我从孩子触发事件时,我无法在父母那里收到它。
子组件
this.$emit('myCustomEvent', this.data);
父组件
<parent-component v-on:myCustomEvent="doSomething"></parent-component>
但是,当我在两个地方都将事件名称更改为 my-custom-event 时,它可以正常工作。
Vue 以某种方式转换事件名称?或者可能是什么问题? 我阅读了docs 关于组件命名约定的内容,但没有与事件命名相关的内容
【问题讨论】:
【参考方案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 也不起作用)
【讨论】:
v2 指南也有解释:vuejs.org/v2/guide/components-custom-events.html#Event-Names 链接问题指出 mixing 骆驼案例与 kebab-case 不起作用。 Kebab-case 本身this.$emit('my-event', this.data);
和 v-on:my-event="doSomething"
工作得很好。【参考方案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 中重新测试了它,它的行为仍然相同。你可能在其他地方有问题。您能否在 *** 上提供更多信息或提出新问题? 我也必须使用 kebab case 发出我的事件才能使其工作,this.$emit('my-event')
。在我的$emit
上使用骆驼皮套不起作用:耸耸肩:
建议始终使用 kebab-case 来命名自定义事件。 使用 camelCase 将不起作用。【参考方案4】:
除了@ssc-hrep3关于kebab-case
的点
.sync 的文档建议使用 update:myPropName
模式
【讨论】:
以上是关于Vue.js 自定义事件命名的主要内容,如果未能解决你的问题,请参考以下文章