vue2中的.native修饰符和$listeners组件属性

一、.native修饰符

在vue2中,写在组件标签上的事件默认是自定义事件。例如:

javascript 复制代码
<MyButton @click="handleClick" />

这里,写在MyButton组件上的click事件不会被触发,因为@click监听的是组件内的通过$emit触发的自定义事件,而不是原生的click事件

.native修饰符的作用则是将事件监听器直接绑定到组件的根元素 上,用于监听组件上的原生DOM事件(如clickinput等)。例如:

javascript 复制代码
// 父组件
<MyButton @click.native="handleClick" />

//子组件
<template>
	<button>Click Me</button>
</template>

这里,vue根据@click.native,会将事件监听器直接绑定到组件的根元素上,也就是说click事件会绑定到<button>上;且如果<button>上已经绑定了的click事件监听器会被覆盖

注意,.native修饰符只能监听组件根元素的原生事件,如果组件的根元素不是目标元素,事件不会被触发。例如:

javascript 复制代码
<template>
	<div>
		<button>Click Me</button>
	</div>
</template>

在这种情况下,@click.native会将事件绑定到<div>上,而不是<button>

注意:Vue3中,.native修饰符被移除,如需监听原生事件,可直接使用v-onemits选项显式声明事件

二、$listeners组件属性

在Vue2中,$listeners是一个特殊的组件属性,用于获取父组件通过v-on绑定在当前组件上的所有事件监听器;子组件中可以使用v-on="$listeners"将父组件的事件监听器绑定到的特定元素上。例如:

javascript 复制代码
// 父组件 @click = v-on:click 
<MyButton @click="handleClick" />

// 子组件
<template>
	<div>
		<button v-on="$listeners">Click Me</button>
	</div>
</template>

这里的$listeners会将父组件的事件监听器绑定到<button>上,会覆盖掉<button>元素上原有的事件监听器

$listeners的结构

$listeners是一个对象,键是事件名,值是对应的回调函数。例如:

javascript 复制代码
{
	click: function() { ... },
	input: function() { ... },
	customEvent: function() { ... }
}

$listeners的高级用法

  1. 结合v-on$listeners
    可以将$listeners与其他事件监听器结合使用

    javascript 复制代码
    <template>
    	<button v-on="{ ...$listeners, mouseover: handleMouseOver }">Click Me</button>
    </template>
    <script>
    export default {
    	methods: {
    		handleMouseOver() {
    			console.log('Mouse over!');
    		},
    	},
    };
    </script>
  2. 过滤或修改事件监听器
    可以通过计算属性对$listeners进行过滤或修改

    javascript 复制代码
    <template>
    	<button v-on="filteredListeners">Click Me</button>
    </template>
    <script>
    export default {
    	computed: {
    		filteredListeners() {
    			//过滤掉某些事件
    			const listeners = { ...this.$listeners };
    			delete listeners.customEvent;
    			return listeners;
    		}
    	}
    }
    </script>

注意:Vue3中,$listeners被移除。事件监听器会被包含在$attrs中,可以通过v-bind="$attrs"传递

三、.native$listeners同时使用

javascript 复制代码
// 父组件
<MyButton @click.native="handleNativeClick" @click="handleCustomClick" @touchstart="handleTouchStart"/>

// 子组件
<template>
	<div>
		<button v-on="$listeners">Click Me</button>
	</div>
</template>

这里,@click.native会将handleNativeClick事件绑定到<MyButton>的根元素,即<div>上;而v-on="$listeners"会将父组件的事件监听器(包括@click="handleCustomClick"@touchstart="handleTouchStart")绑定到<button>

ps: 为什么handleNativeClick事件不受$listeners影响呢?

$listeners只包含父组件通过v-on绑定的 .native 的事件监听器;换句话说,$listeners只会收集通过$emit触发的自定义事件

相关推荐
出征6 分钟前
Pnpm的进化进程
前端
屿小夏19 分钟前
openGauss020-openGauss 向量数据库深度解析:从存储到AI的全栈优化
前端
Y***985131 分钟前
【学术会议论文投稿】Spring Boot实战:零基础打造你的Web应用新纪元
前端·spring boot·后端
T***u33336 分钟前
JavaScript在Node.js中的流处理大
开发语言·javascript·node.js
q***33371 小时前
SpringMVC新版本踩坑[已解决]
android·前端·后端
Croa-vo1 小时前
TikTok 数据工程师三轮 VO 超详细面经:技术深挖 + 建模推导 + 压力测试全记录
javascript·数据结构·经验分享·算法·面试
亿元程序员1 小时前
做了十年游戏,我才意识到:程序员最该投资的,是一台专业的编程显示器
前端
IT_陈寒2 小时前
Python高手都在用的5个隐藏技巧,让你的代码效率提升50%
前端·人工智能·后端
源码技术栈2 小时前
什么是云门诊系统、云诊所系统?
java·vue.js·spring boot·源码·门诊·云门诊
lcc1872 小时前
Vue3 ref函数和reactive函数
前端·vue.js