首页 > 其他分享 >Vue 中 @click 和 .native 修饰符的详细解析

Vue 中 @click 和 .native 修饰符的详细解析

时间:2024-12-21 19:03:20浏览次数:8  
标签:修饰符 HTML 元素 MyComponent 点击 Vue 组件 click

今天在项目中实现点击跳转页面的时候遇到了el-col添加@click无效的状况,查了一些相关资料,记录一下。

目录
  1. 简介
  2. 原生 HTML 元素与自定义组件
  3. @click 的工作原理
  4. .native 修饰符的作用
  5. 根元素一定是原生 HTML 元素吗?
  6. 总结
  7. 示例代码

1.简介

在 Vue.js 中,事件绑定是开发过程中非常常见的操作。@click 是一个常用的指令,用于监听点击事件。然而,在使用封装好的 UI 库组件(如 Element UI 的 el-col)时,直接使用 @click 可能无法达到预期效果。这时,.native 修饰符就派上了用场。本文将详细解释 @click 和 .native 修饰符的工作原理。

2.原生 HTML 元素与自定义组件

  • 原生 HTML 元素:指浏览器内置的 HTML 标签,如 <div><button> 等。
  • 自定义组件:由开发者或第三方库提供的可复用组件,如 el-colMyComponent 等。

3.@click 的工作原理

3.1. 绑定到原生 HTML 元素

对于原生的 HTML 元素,@click 直接绑定到该元素的点击事件上。

<!-- 绑定到原生 div 元素 -->
<div @click="handleClick">点击我</div>
3.2. 绑定到自定义组件

对于自定义组件,默认情况下,@click 监听的是组件实例上的自定义事件(即组件内部通过 $emit('click') 触发的事件)。如果组件没有定义和触发 click 事件,那么 @click 将不会有任何效果。

<!-- 自定义组件 MyComponent.vue -->
<template>
  <div class="my-component">
    <!-- 内部内容 -->
  </div>
</template>

<script>
export default {
  name: 'MyComponent'
}
</script>
<!-- 使用自定义组件 -->
<template>
  <div>
    <!-- 没有 .native,监听组件实例上的自定义事件 -->
    <MyComponent @click="handleClick" />
  </div>
</template>

<script>
import MyComponent from './MyComponent.vue'

export default {
  components: {
    MyComponent
  },
  methods: {
    handleClick() {
      console.log('点击了!')
    }
  }
}
</script>

在这个例子中,由于 MyComponent 内部没有触发 click 事件,所以点击不会触发 handleClick


4.native 修饰符的作用

.native 修饰符用于将事件绑定到组件的根元素(即组件模板中最外层的原生 HTML 元素)上,而不是组件实例上的自定义事件。

<!-- 使用 .native,监听组件根元素上的点击事件 -->
<MyComponent @click.native="handleClick" />

在这个例子中,@click.native 将点击事件直接绑定到 MyComponent 组件的根元素上,从而实现了预期的点击行为。


5.根元素一定是原生 HTML 元素吗?

是的,组件的根元素必须是一个原生的 HTML 元素。这是因为 Vue 的渲染机制要求每个组件最终渲染为一个 DOM 元素。即使你使用的是封装好的 UI 库组件(如 Element UI 的 el-col),这些组件最终也会被编译成原生的 HTML 元素。

例如,el-col 组件可能最终渲染为如下结构:

<div class="el-col el-col-6" style="cursor: pointer;">
  <!-- 内容 -->
</div>

因此,当你使用 .native 时,实际上是在绑定到这个最外层的 div 上的点击事件。

 这里不复制源码了,大家想了解el-col 组件源码的话可以参考这个博主的文章,我上面只是举个例子。

https://www.codeleading.com/article/59365766554/

6.总结

  • @click:默认监听组件实例上的自定义事件(如 $emit('click'))。如果组件没有定义和触发该事件,则不会生效。
  • @click.native:将点击事件绑定到组件的根元素(即最外层的原生 HTML 元素)上,确保点击事件能够正常触发。
  • 根元素:组件的根元素必须是原生的 HTML 元素,因为 Vue 需要将其编译为实际的 DOM 结构。

7.示例代码

为了更清楚地理解这一点,我们可以通过一个简单的例子来说明:

<!-- 自定义组件 MyComponent.vue -->
<template>
  <div class="my-component">
    <!-- 内部内容 -->
  </div>
</template>

<script>
export default {
  name: 'MyComponent'
}
</script>
<!-- 使用自定义组件 -->
<template>
  <div>
    <!-- 没有 .native,监听组件实例上的自定义事件 -->
    <MyComponent @click="handleClick" />

    <!-- 使用 .native,监听组件根元素上的点击事件 -->
    <MyComponent @click.native="handleClick" />
  </div>
</template>

<script>
import MyComponent from './MyComponent.vue'

export default {
  components: {
    MyComponent
  },
  methods: {
    handleClick() {
      console.log('点击了!')
    }
  }
}
</script>

在上面的例子中:

  • 第一个 MyComponent 使用 @click,由于组件内部没有触发 click 事件,所以点击不会触发 handleClick
  • 第二个 MyComponent 使用 @click.native,点击会直接触发 handleClick,因为它绑定了根元素的点击事件。

我希望能帮助大家更好地理解 @click.native 的工作原理。这是我第一次整理这些信息,可能会有不完善或不太准确的地方,欢迎大家指正哦!如果你有任何疑问或是有不同的见解,都非常欢迎在这里分享和讨论,我们一起学习进步!

标签:修饰符,HTML,元素,MyComponent,点击,Vue,组件,click
From: https://blog.csdn.net/m0_74966028/article/details/144634327

相关文章

  • 基于Uniapp + SpringBoot + Vue的热岛志愿者服务小程序
    文章目录前言一、详细操作演示视频二、具体实现截图三、技术栈1.前端-Vue.js2.后端-SpringBoot3.数据库-MySQL4.系统架构-B/S四、系统测试1.系统测试概述2.系统功能测试3.系统测试结论五、项目代码参考六、数据库代码参考七、项目论文示例结语前言......
  • 基于Uniapp + SpringBoot + Vue的民宿预订小程序小程序
    文章目录前言一、详细操作演示视频二、具体实现截图三、技术栈1.前端-Vue.js2.后端-SpringBoot3.数据库-MySQL4.系统架构-B/S四、系统测试1.系统测试概述2.系统功能测试3.系统测试结论五、项目代码参考六、数据库代码参考七、项目论文示例结语前言......
  • 39.在 Vue3 中使用 OpenLayers 导出 GeoJSON 文件及详解 GEOJSON 格式
    一、引言在Web地图开发领域,Vue3作为一款流行的前端框架,结合强大的OpenLayers地图库,能够实现丰富多样的地图功能。其中,将地图数据以GeoJSON格式导出是一项常见且实用的需求,本文将深入探讨如何在Vue3环境下借助OpenLayers达成这一目标,并详细剖析GeoJSON格式文件。......
  • 40.在 Vue3 中使用 OpenLayers 实现 canvas 遮罩效果
    一、引言在Vue3前端开发与地图应用结合的场景中,OpenLayers作为强大的地图库,为我们带来了丰富多样的功能拓展可能性。今天,我们将深入探讨如何利用OpenLayers在Vue3项目里巧妙地实现canvas遮罩效果,这一技巧能够为地图应用增添独特的交互体验与视觉呈现,无论是突出特定区......
  • Java基于springboot+vue的易物小店交换系统
    收藏关注不迷路!!......
  • Java基于SpringBoot的停车位租赁小程序(两端:移动端、PC端)-java vue.js idea
    所需该项目可以在最下面查看联系方式,为防止迷路可以收藏文章,以防后期找不到项目介绍Java基于SpringBoot的停车位租赁小程序(两端:移动端、PC端)-javavue.jsidea系统实现截图技术栈介绍JDK版本:jdk1.8+编程语言:java框架支持:springboot数据库:mysql版本不限......
  • Java基于SpringBoot的体育购物商城-java vue.js idea
    所需该项目可以在最下面查看联系方式,为防止迷路可以收藏文章,以防后期找不到项目介绍Java基于SpringBoot的体育购物商城-javavue.jsidea系统实现截图技术栈介绍JDK版本:jdk1.8+编程语言:java框架支持:springboot数据库:mysql版本不限数据库工具:Na......
  • 基于 Vue 的 SSM 医院预约挂号系统设计与高效实现
    6系统测试6.1概念和意义测试的定义:程序测试是为了发现错误而执行程序的过程。测试(Testing)的任务与目的可以描述为:目的:发现程序的错误;任务:通过在计算机上执行程序,暴露程序中潜在的错误。另一个预测是相关的术语叫纠错(Debugging)。它的目的与任务可以规定为:目的:定位......
  • 医疗服务品质提升:SSM 与 Vue 打造医院预约挂号系统方案
    摘要随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了医院预约挂号系统的开发全过程。通过分析医院预约挂号系统管理的不足,创建了一个计算机管理医院预约挂号系统的方案。文章介绍了医院预约挂号系统的系统分析部分,包括可行性......
  • 智慧医疗挂号前沿:SSM+Vue 医院预约挂号系统设计与突破
    4系统概要设计4.1概述本系统采用B/S结构(Browser/Server,浏览器/服务器结构)和基于Web服务两种模式,是一个适用于Internet环境下的模型结构。只要用户能连上Internet,便可以在任何时间、任何地点使用。系统工作原理图如图4-1所示:图4-1系统工作原理图4.2系统结构本系统......