前言

本笔记主要基于官方文档《迁移策略—— 移除v-on.native修饰符》汇总而来。如有理解出入,请以官方文档为主。建议您以官方文档为主,本文为辅。这样您可以“以自己为主”审视的阅读,从而不被我的观点带偏。

知识储备

概述

在 Vue 3.x v-on.native 修饰符将被移除。

Vue 2.x 的 .native 修饰符

在 Vue 2.x,如果想要在一个组件的根元素上直接监听一个原生事件,需要使用v-on.native 修饰符。

<base-input v-on:focus.native="onFocus"></base-input>

Vue 3.x 取消 .native 修饰符

.native 修饰符在 Vue 3.x 已经移除掉了。取而代之的是,在新增的 emits 选项中定义当前组件真正触发的事件(即,组件事件)。此外,Vue 现在将所有未在组件emits 选项中定义的事件作为原生事件添加到子组件的根元素中(除非子组件选项中设置了 inheritAttrs: false)。

<my-component
  v-on:close="handleComponentEvent"
  v-on:click="handleNativeClickEvent"
/>

MyComponent.vue

<template>
	<div>
		<button v-on:click="$emit('click')">click</button>
		<button v-on:click="$emit('close')">close</button>
	</div>
</template>
<script>
  export default {
    emits: ['close']
  }
</script>

上面代码的执行结果是:click事件会被自动添加到<div>中,所以当子组件被点击时,就会触发click事件。

若改成这样:

<template>
	<div>
		<button v-on:click="$emit('click')">click</button>
		<button v-on:click="$emit('close')">close</button>
	</div>
</template>
<script>
  export default {
    emits: ['close', 'click']
  }
</script>

click事件不会被添加给<div>

强烈建议组件中使用的所有通过emit触发的event都在emits中声明。


本系列目录

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐