vue.js给自定义组件绑定原生事件

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 属性(它是一个对象,里面包含了作用在这个组件上的所有监听器。)
  1. 使用v-on="$listeners"将所有的事件监听器指向这个组件的某个特定的子元素
<template>
  <button
    :disabled="mixin_controlDisable"
    :class="$style.button"
    v-on="$listeners"
  >
  </button>
</template>
  1. 对于类似<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>
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值