vue中的事件

vue中的事件是什么

  • 绑定事件用v-on,简写@
  • v-on指令的参数是事件名(原生或者自定义),值是事件处理器
  • 有原生事件(click)和自定义事件(myEvent)
  • 在组件上使用原生事件,需要加native修饰符

自定义事件

  • 需要使用emit方法,emit(‘事件名’,参数)
  • 自定义事件名的规范(script中用小驼峰,模板中用短横线)
emit('eventName')
<Son @event-name="handler">
----------------------------------------------------------------
1、组合api中
setup(props, {emit}) {
	const clickHandler = () => {
		emit('xxx', data)
	}
}
2、setup语法糖中(非TS)
const emits = defineEmits(['xxx1', 'xxx2'])
3、setup语法糖中(使用TS)
const emit = defineEmits<{
  (e: 'xxx1', msg: String): void,
  (e: 'xxx2', num: Number): void,
}>()
emit('xxx1', 'jim')

事件处理器中的参数

  • 原生事件的事件处理器中的参数
// 方法事件处理器没有显示的传\$event,但在方法中仍然可以获取事件对象
<div @click="handler">
handler(e) {
	// e为事件对象
}
// 内联事件处理器中,如果方法要额外传参数,需要显示写出\$event(表明这个参数的位置,便于区分参数)
<div @click="handler($event, 123)">
handler(e, msg) {
	// e为事件对象,msg是123
}
  • 自定义事件的事件处理器中的参数
// 方法事件处理器没有显示的传\$event,但在方法中仍然可以获取自定义事件传递的参数
<div @eventName="handler">
handler(eventData) {
	// eventData为自定义事件传递的参数
}
// 内联事件处理器中,如果方法要额外传参数,需要显示写出\$event(表明这个参数的位置,便于区分参数)
<Son @eventName="handler(123, $event)" />
handler(msg, eventData) {
	// msg是123,eventData为自定义事件传递的参数
}

on和emit的实现

o n 、 on、 onemit是基于订阅观察者模式的,维护一个事件中心,on的时候将事件按名称存在事件中心里,称之为订阅者,然后emit将对应的事件进行发布,去执行事件中心里的对应的监听器

1、vue先创建一个构造器,维护一个事件中心events
function EventEmiter(){
    this.events = {}
}
2、$on
EventEmiter.prototype.on = function(event,cb){
    if(this.events[event]){
        this.events[event].push(cb)
    }else{
        this.events[event] = [cb]
    }
}
3、$emit
EventEmiter.prototype.emit = function(event){
    let args = Array.from(arguments).slice(1)
    let cbs = this.events[event]
    if(cbs){
        cbs.forEach(cb=>{
            cb.apply(this,args)
        })
    }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值