Vue中事件绑定和vm.$listeners

问题

最近看别人的源码, 看到一个v-on="on"不太理解, 应为我们通常绑定事件都是v-on:click="event"这样来的,于是自己试试了

探索

在子组件中设置

v-on="{ change: test }" 

发现能正常绑定,emm。
有空还是去看Vue的源码吧, 工作都没有的我…

实践

于是我们可以这样组封装一些组件

<template>
  <el-select v-model="newValue" v-bind="props" v-on="on" multiple>
    <el-option
      v-for="(item, index) in list"
      :value="item.id"
      :label="item.name"
      :key="index"
    ></el-option>
  </el-select>
</template>

<script>
export default {
  props: {
    value: [String, Number, Array],
    props: Object,
    on: Object
  },

  data() {
    return {
      list: [],
      newValue: this.value
    }
  },

  watch: {
    value(val) {
      if (!(val instanceof Array)) {
        this.newValue = [val]
      } else {
        this.newValue = val
      }
    },

    newValue(val) {
      console.log(this)
      this.$emit('input', val)
    }
  },

  async created() {
    this.list = await this.$service.system.role.list()
  },
  methods: {
    test(e) {
      console.log(e, 'test')
    }
  }
}
</script>

<style lang="stylus" scoped></style>

调用

这里仅做说明, 这里是调用了其他的组件, 通过这种方法绑定数据, 可以参考用法。
在这里插入图片描述

vm.$listeners

这个属性就是在父组件中引用的子组件上绑定事件(<child @eventName="myEvent"></child>), 然后我们可以在子组件this.$listeners可以取到eventName这个方法。
子组件可以通过this.$emit('eventName', data) 执行父组件绑定的方法。
其实就是常用的子组件向父组件传递数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值