我的编程空间,编程开发者的网络收藏夹
学习永远不晚

vue中可以绑定多个事件吗

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

vue中可以绑定多个事件吗

vue可以绑定多个事件吗

标签绑定一个事件处理函数,然后在相应的事件处理函数中调用想要触发的多个处理函数

以下两种方案,都可以实施

第一种

<button id="test" @click="test1">按钮</button>
new Vue({
    el:"#test",
    data:"",
    methods:{
        test1:function(){
            alert("test1");
            this.test2();
            this.test3();
        },
        test2:function(){
            alert("test2");
        },
        test3:function(){
            alert("test3");
        }
    }
})

第二种

绑定多个事件时,事件之间使用分号“;”分开即可

<el-button type="primary" size="small" @click="add1();add2();">123</el-button>

去methods中添加事件的函数

methods:{
    add1(){
        console.log(123)
    },
    add2(){
        console.log(456)
    },
    }

vue事件绑定的原理

之前我搜这个原理的时候,好多文章,都只写了两句话:

  • 原生事件绑定是通过addEventListener绑定给真实元素的。
  • 组件事件绑定是通过Vue自定义的key$on实现的。

那具体是怎么实现的呢, 没有说?

就现在具体看一下。

// 原生事件绑定
<div @click="fn()"></div>
// 组件绑定
<my-component @click.native="fn" @click="fn1"></my- component>

原理:

事件的编译:

let compiler = require('vue-template-compiler'); //vue-loader
let r1 = compiler.compile('<div @click="fn()"></div>'); 
let r2 = compiler.compile('<my-component @click.native="fn" @click="fn1"></my- component>'); console.log(r1); 
// {on:{click}} console.log(r2); 
// {nativeOn:{click},on:{click}}

两者编译出来不一样

// 前者
with (this){return _c('div',{on:{"click":function($event){return fn()}}})}
// 后者
with (this){return _c('my-component',{on:{"click":fn1},nativeOn:{"click":function($event){return fn($event)}}})}

在这里插入图片描述

1.1 原生 dom 的绑定

  • Vue 在创建真是 dom 时会调用 createElm ,默认会调用 invokeCreateHooks
  • 会遍历当前平台下相对的属性处理代码,其中就有 updateDOMListeners 方法,内部会传入 add 方法

源码:

function updateDOMListeners (oldVnode: VNodeWithData, vnode: VNodeWithData) { 
	if (isUndef(oldVnode.data.on) && isUndef(vnode.data.on)) { return }
	const on = vnode.data.on || {} const oldOn = oldVnode.data.on || {} 
	target = vnode.elm 
	normalizeEvents(on) 
	updateListeners(on, oldOn, add, remove, createOnceHandler, vnode.context) 
	target = undefined 
}
function add ( 
	name: string, 
	handler: Function, 
	capture: boolean, 
	passive: boolean 
) {
	target.addEventListener( // 给当前的dom添加事件 
		name, 
		handler, 
		supportsPassive 
		? {  capture, passive  } 
		: capture 
	) 
}

1.2 组件中绑定事件

export function updateComponentListeners ( 
	vm: Component, 
	listeners: Object, 
	oldListeners: ?Object 
) {
	target = vm updateListeners(
		listeners, oldListeners || {}, 
		add, 
		remove,
		createOnceHandler, vm)
		target = undefined 
}
function add (event, fn) { 
	target.$on(event, fn) 
}

组件绑定事件是通过 vue 中自定义的 $on 方法来实现的

1.3 $on 是怎么实现的

vm.$on( event, callback )

作用:

监听当前实例上的自定义事件。事件可以由vm.$emit触发。回调函数会接收所有传入事件触发函数的额外参数。

原理:

$on是采用了经典的发布订阅者设计模式,首先定义一个事件中心,通过$on订阅事件,将事件存储在事件中心里面,然后通过$emit触发事件中心里面存储的订阅事件。

Vue.prototype.$on = function (event, fn) {
    const vm: Component = this
    if (Array.isArray(event)) {
        for (let i = 0, l = event.length; i < l; i++) {
            this.$on(event[i], fn)
        }
    } else {
        (vm._events[event] || (vm._events[event] = [])).push(fn)
    }
    return vm
}

看代码,逻辑很简单,$on函数接收俩个参数,第一个是订阅的事件名,可以是多个,如果是多个就传入一个事件名数组。另一个是回调函数。

首先判断传入的事件是不是一个数组,如果是,那么遍历这个数组,将数组中的每一个事件都递归调用$on方法将其作为单个事件订阅。

如过不是数组,那就当做单个事件名来处理,以该事件名作为key,先尝试在当前实例的_events属性中获取其对应的事件列表,如果获取不到就给其赋空数组为默认值,并将第二个参数回调函数添加进去。

多说一句,实例的_events是什么?这就是在事件初始化的时候,initEvents函数中绑定了_event属性并给其赋值为空对象。这个_events属性就是用来作为当前实例的事件中心,所有绑定在这个实例上的事件都会存储在事件中心_events属性中。

这就是$on的内部原理。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

vue中可以绑定多个事件吗

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

vue中可以绑定多个事件吗

这篇文章主要介绍了vue中可以绑定多个事件吗,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2022-11-13

vue单个元素绑定多个事件问题(例如点击绑定多个事件方法)

这篇文章主要介绍了vue单个元素绑定多个事件问题(例如点击绑定多个事件方法),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-05-16

jquery可以为按钮绑定点击事件吗

jquery可以为按钮绑定点击事件。绑定方法:1、利用选择器选取按钮元素对象,语法“$("选择器")”,会返回包含指定按钮元素的jquery对象;2、使用click()或dblclick()函数为按钮绑定点击事件,语法“按钮元素对象.click(function(){//运行代码});”或“按钮元素对象.dblclick(function(){//运行代码});”。
2023-05-14

云服务器可以绑定多个域名吗

云服务器可以绑定多个域名。以下是绑定多个域名的步骤:首先,使用ApacheWeb服务器来绑定多个域名,具体方法:a.在ApacheWeb服务器上输入以下命令:@echooff以下是一个示例操作,使用ApacheWeb服务器执行:启动ApacheWeb服务器ApacheWebServer-d-padmin创建ApacheWeb服务器的用户admin="MyServername"
2023-10-26

jQuery如何绑定多个事件?

jQuery提供便捷的方式绑定多个事件到单个元素,使用语法:$(selector).on(events,data,handler)。委托技术可优化处理大量元素,使用语法:$(parentSelector).on(events,childSelector,data,handler)。事件命名空间允许区分相同事件类型的处理程序,语法为:$(selector).on(events.namespace,data,handler)。解除事件绑定使用语法:$(selector).off(events,handler)
jQuery如何绑定多个事件?
2024-04-08

jQuery绑定点击事件与改变事件的方式总结及多个元素绑定多个事件

我们一说到jQuery中对于元素的修改,就是元素的内容、属性、样式的修改,下面这篇文章主要给大家介绍了关于jQuery绑定点击事件与改变事件的方式总结及多个元素绑定多个事件的相关资料,需要的朋友可以参考下
2022-12-14

一台云服务器可以绑定多个弹性网卡吗

是的,一台云服务器可以绑定多个弹性网卡。在这种情况下,云服务器上的每个虚拟计算节点都会与其所连接的多个物理服务器进行连接。这意味着,云服务器可以提供多个网卡,每个网卡可以与一个或多个物理服务器进行通信。这种方法也被称为负载平衡或多租户技术。当一个客户尝试访问多个物理服务器时,他们可能需要知道哪个网卡正在与哪个服务器通信,以便能够正确地访问它们。负载平衡可以确保每个客户都只访问与他们自己相应的网卡匹配的服...
2023-10-27

Vue中的事件绑定与解绑方式

这篇文章主要介绍了Vue中的事件绑定与解绑方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2022-11-13

一台云服务器可以绑定多个弹性网卡吗安全吗

首先,要确保设备和服务都被授权。如果你的设备和服务都没有被授权,那么云服务器就不会允许你绑定弹性网卡。因此,在购买云服务器时,需要确保设备和服务都被授权。其次,需要了解云服务器的安全设置。通常,云服务器会设置密码保护和认证机制,以确保数据和服务的安全性。如果你不确定云服务器的安全设置,可以查看它们的网站,或者联系他们的
一台云服务器可以绑定多个弹性网卡吗安全吗
2023-10-28

一台云服务器可以绑定多个eip

如果您要绑定多个IP,可以考虑使用以下方法:使用HTTPServer:通常情况下,您可以使用以下命令将多个IP绑定在同一台云服务器上:ServerNamehttp://example.comAddressxxx.xxx.comIP10.0.0.1002其中,x.xxx.com指定服务器名称,x.0.0.1002指定服务器IP的10位数字长度,以字母A开头,后面接续10位数字,如:
2023-10-26

编程热搜

目录