16. 自定义事件

2019-06-01  本文已影响0人  论宅

事件名称

不同于组件和 prop,事件名不会被用作一个 JavaScript 变量名或属性名,所以就没有理由使用 camelCase 或 PascalCase 了。并且 v-on 事件监听器在 DOM 模板中会被自动转换为全小写 (因为 HTML 是大小写不敏感的),所以 v-on:myEvent 将会变成 v-on:myevent——导致 myEvent 不可能被监听到。

因此,我们推荐你始终使用 kebab-case 的事件名。

如果想要触发一个事件,如my-event

this.$emit('my-event')

自定义组件的v-model

一个组件上的v-model默认利用名为value的属性和input的事件,但是像单选框,复选框等可能将value用作其他目的,而model选项可以来避免这种冲突:

Vue.component('base-checkbox', {
  model: {
    prop: 'checked',
    event: 'change'
  },
  props: {
    checked: Boolean
  },
  template: `
    <input
      type="checkbox"
      v-bind:checked="checked"
      v-on:change="$emit('change', $event.target.checked)"
    >
  `
})

这样在这个组件上使用v-model的时候

<base-checkbox v-model="lovingVue"></base-checkbox>

这里的lovingVue的值将会传入props,同时当该组件触发一个change事件的时候,这个lovingVue的属性将会被更新。

将原生事件绑定到子组件

 <template2 @click="clickMethod"></template2>

如果单纯的写上这种监听事件,会发现没有任何作用,点击事件不会生效,想要生效则需要这么写:

<template2 @click.native="clickMethod">加了native就有效果</template2>

但即使如此,如果新的组件内容比较复杂,即使在标签上如上写上onfocus,也不一定能将事件绑定到对应的input上:

<template4 @focus="console.log(123)"></template4>

var template4 = {
            template: `
            <div>点击没有任何效果?
                <input @click="this.$listeners.focus" >
                </div>

            `,
            created() {
                console.log(this.$listeners)
            },
            methods: {
                inputListeners: function () {
                    console.log("???")
                }
            },

            computed: {

            }
        }

如上,input在div中包裹着,这样focus事件是不会绑定到对应的input上,所以需要$listeners属性。

$listeners属性会保存标签上绑定来的所有事件

所以,可以通过该属性来正确调取需要的监听事件:

<input @click="this.$listeners.focus" >
上一篇 下一篇

猜你喜欢

热点阅读