vue.js给自定义组件绑定原生事件
- .native修饰符
你可能有很多次想要在一个组件的根元素上直接监听一个原生事件。这时,你可以使用 v-on 的 .native 修饰符:
<base-input v-on:focus.native="onFocus"></base-input> // 如果不写.native事件是无效的
例子:
<div id='root'>
<child @click.native='handleClick'></child> //不加.native无效
</div>
<script>
Vue.component('child',{
template:'<div>hello</div>'
})
var vm = new Vue({
el:'#root',
methods:{
handleClick:function(){
alert(1);
}
}
})
</script>
- 如以下根元素实际上是一个
<label>
元素时,原生事件不能被绑定到input事件上,再用.native
是无效的
例子:
//证明.native在这种情况下不好使
<label-child @focus.native="onFocus"></label-child> //onFocus触发无效,有《label》标签的
Vue.component('label-child', {
template:`
<label>
<input></input>
</label>
`
})
$listeners
属性(它是一个对象,里面包含了作用在这个组件上的所有监听器。)
- 使用
v-on="$listeners"
将所有的事件监听器指向这个组件的某个特定的子元素
<template>
<button
:disabled="mixin_controlDisable"
:class="$style.button"
v-on="$listeners"
>
</button>
</template>
- 对于类似
<input>
的你希望它也可以配合v-model
工作的组件来说,为这些监听器创建一个类似下述 listeners 的计算属性通常是非常有用的
Vue.component('base-input', {
inheritAttrs: false,
props: ['label', 'value'],
computed: {
inputListeners: function () {
var vm = this
// `Object.assign` 将所有的对象合并为一个新对象
return Object.assign({},
// 我们从父级添加所有的监听器
this.$listeners,
// 然后我们添加自定义监听器,
// 或覆写一些监听器的行为
{
// 这里确保组件配合 `v-model` 的工作
input: function (event) {
vm.$emit('input', event.target.value)
}
}
)
}
},
template: `
<label>
{{ label }}
<input
v-bind="$attrs"
v-bind:value="value"
v-on="inputListeners"
>
</label>
`
})
现在<base-input>
组件是一个完全透明的包裹器了,也就是说它可以完全像一个普通的<input>
元素一样使用了:所有跟它相同的特性和监听器的都可以工作。
<base-input v-on:focus="onFocus"></base-input>