【超细节】Vue3组件事件怎么声明,defineEmits与emit

news2024/11/26 17:49:30

目录

前言

一、基本语法

1. 子组件触发

2. 父组件监听

二、 事件参数

1. 传值

2. 接收值

三、 事件校验

四、注意事项


前言

组件事件是 Vue 组件之间进行通信的一种方式。它允许一个组件触发一个自定义事件,并且其他组件可以监听并响应这个事件。

一、基本语法

1. 子组件触发

子组件触发自定义的事件有两种方式。

  • 模板表达式中

在组件的模板表达式中,可以直接使用 $emit 方法触发自定义事件,例如:

<!-- SonCom -->
<button @click="$emit('someEvent')">click me</button>
  • <script setup> 里

显式地通过 defineEmits() 宏来声明它要触发的事件。注意,defineEmits只等在<script setup> 的顶级作用域下使用,不能在别的函数里。

科普一下:在计算机编程中,宏(Macro)通常是一种预处理指令或代码片段,用于在编译过程之前进行文本替换和代码生成。宏可以帮助简化代码编写、提高代码的复用性和可维护性。

然后使用defineEmits() 返回的跟模板里面的 $emit 相同作用的函数来触发。

<script setup>
// 声明
const emit = defineEmits(['touchFather', 'submitFather'])

// 触发
function buttonClick() {
  emit('touchFather')
}
</script>
  • 非 <script setup> 里

事件需要通过 emits 选项来定义,emit 函数也被暴露在 setup() 的上下文对象上。

export default {
  emits: ['inFocus', 'submit'],
  setup(props, ctx) {
    ctx.emit('submit')
  }
}

2. 父组件监听

和Vue2一样,父组件可以通过 v-on (缩写为 @) 来监听事件:

<SonCom @some-event="callback" />

ps:事件名可以用驼峰形式,但是在模板中是推荐使用kebab-case 形式来编写。

二、 事件参数

如果我们需要再触发事件的时候给父组件传特定的值,就可以提供给 $emit 额外的参数。

1. 传值

  • 模板里传值
<button @click="$emit('chooseA', 1)">
  chooseA
</button>
  • script里传值
<script setup>
// 声明
const emit = defineEmits(['touchFather', 'submitFather'])

// 触发并传值
function buttonClick() {
  emit('touchFather', num)
}
</script>

所有传入 $emit() 或 emit() 的额外参数都会传过去,传参不限制个数。

2. 接收值

  • 模板里接收值
<SonCom @touch-father="(num) => count = num" />
  • 方法里接收值
<SonCom @touch-father="handleNum" />

<script>
    function handleNum(num) {
      count.value += num
    }
</script>

三、 事件校验

事件也可以像Props一样来进行校验。只需要将上面的数组换成对象。对象里事件被赋值为一个函数。接受的参数就是抛出事件时传入 emit 的内容,返回一个布尔值来表明事件是否合法。

<script setup>
const emit = defineEmits({
  // 没有校验
  touchFather: null,

  // 校验 submitFather 事件
  submitFather: ({ email, password }) => {
    if (email && password) {
      return true
    } else {
      console.warn('Invalid submit event payload!')
      return false
    }
  }
})

function submitForm(email, password) {
  emit('submitFather', { email, password })
}
</script>

示例:

子组件:校验并且传参不符合校验规则

<template>
  <div>
    <button @click="submitForm">子传父</button>
  </div>
</template>

<script setup>
  const obj = {
    email: '',
    password: ''
  }

  const emit = defineEmits({
    // 没有校验
    touchFather: null,

    // 校验 submitFather 事件
    submitFather: ({ email, password }) => {
      if (email && password) {
        return true
      }
      console.log('传参无效!')
      return false
    }
  })

  function submitForm() {
    emit('submitFather', obj)
  }
</script>

父组件:

<template>
  <div>
    <ChildComponent @submit-father="handle" />
  </div>
</template>

<script setup>
  import ChildComponent from './ChildComponent.vue'
  function handle({ email, password }) {
    console.log('父组件——', email, password)
  }
</script>

运行结果:

传参失败,并且Vue报错。

如果给obj值通过校验:

<template>
  <div>
    <button @click="submitForm">子传父</button>
  </div>
</template>

<script setup>
  const obj = {
    email: 123,
    password: 123
  }

  const emit = defineEmits({
    // 没有校验
    touchFather: null,

    // 校验 submitFather 事件
    submitFather: ({ email, password }) => {
      if (email && password) {
        return true
      }
      console.log('传参无效!')
      return false
    }
  })

  function submitForm() {
    emit('submitFather', obj)
  }
</script>

结果:

四、注意事项

1. 组件触发的事件没有冒泡机制

2. 如果一个原生事件的名字 (例如 click) 被定义在 emits 选项中,则监听器只会监听组件触发的 click 事件而不会再响应原生的 click 事件。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/835408.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

1308. 方程的解(隔板法)

题目链接&#xff1a;https://www.acwing.com/activity/content/problem/content/1761/ 本题需要用高精度 Code #include <cstring> #include <iostream> #include <algorithm>using namespace std;const int N 150;int k, x; int f[1000][100][N];int qm…

Docker实战-如何去访问Docker仓库?

导语   仓库在之前的分享中我们介绍过,它主要的作用就是用来存放镜像文件,又可以分为是公共的仓库和私有仓库。有点类似于Maven的中央仓库和公司内部私服。 下面我们就来介绍一下在Docker中如何去访问各种仓库。 Docker Hub 公共镜像仓库 Docker Hub 是Docker官方提供的最…

基于JAVA SpringBoot和HTML校园二手商城系统设计

随着网络技术的飞跃&#xff0c;人类的社会生活和现代信息技术呈现出不断融合的趋势&#xff0c;生活中的日常账单支付、网上购物、网上学习和娱乐等。二手交易平台应运而生&#xff0c;其主要目的是充分交换人们闲置的产品。你可以在交易平台上发布二手商品&#xff0c;然后有…

promise中then和catch同时调用

promise同时执行then和catch 之前一直对promise中的then函数和catch有误区&#xff0c;以为resolve就直接走then&#xff0c;reject走catch&#xff0c;但在最近项目中遇到了then和catch同时触发。 下面我们来看一组例子 let count 0const func async () > {countComput…

CAD中快速加载卫星影像的免费插件

在对GIS矢量地图数据进行处理的工作中&#xff0c;我们经常会将卫星影像插入到CAD中作为底图&#xff0c;从而便于与矢量地图数据进行叠加对比&#xff0c;但怎样才能将带坐标的卫星影像快速插入到CAD中呢&#xff1f; CAD中卫星影像与矢量数据叠加 这里分享一个可以在CAD中加…

jacoco多版本报告合并

jacoco提供了一个merge命令可以给我方便的合并代码无变更时的报告&#xff0c;但是一旦代码发生变化&#xff0c;则无法通过jacoco进行直接合并&#xff0c;原因在《jacoco的多次代码提交merge分析》中已经说明&#xff0c;那么针对一次功能测试&#xff0c;势必会进行多轮&…

【C语言进阶(1)】数据存储

文章目录 Ⅰ 数据类型介绍⒈类型的基本分类 Ⅱ 整形在内存中的存储⒈原码、反码、补码⒉大小端介绍及判断大小端 Ⅲ 浮点型在内存中的存储⒈浮点数在内存中的存储规则⒉IEEE 754 对 M 和 E 的存取规定⒊解释前面的题目 Ⅰ 数据类型介绍 基本内置类型 类型类型名称char字符数据…

玄子Share - Mybatis 项目模板使用指南

玄子Share - Mybatis 项目模板使用指南 项目结构图 mybatis-config.xml 配置模板设置 参数 <?xml version"1.0" encoding"UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "https://mybatis.…

pycharm运行pytest无法实时输出信息

需要去掉控制台输出。根据查询相关信息显示pycharm运行pytest无法实时输出信息&#xff0c;需要去掉pycharm里面的运行模式&#xff0c;点击减号&#xff0c;再点击加号&#xff0c;添加python执行文件即可实时输出信息。 问题描述&#xff1a; 使用pycharm运行代码时&#x…

24考研数据结构-树与森林

目录 5.4树、森林5.4.1树的存储结构1. 双亲表示法(顺序存储)&#xff1a;2. 孩子表示法(顺序链式)3. 孩子兄弟表示法&#xff08;链式&#xff09; 5.4.2树、森林与二叉树的转换5.4.3树、森林的遍历1. 树的遍历先根遍历后根遍历层序遍历&#xff08;队列实现&#xff09; 2. 森…

LeetCode-26-删除有序数组中的重复项

一&#xff1a;题目描述&#xff1a; 给你一个 升序排列 的数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使每个元素 只出现一次 &#xff0c;返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。 考虑 nums 的唯…

AI相机“妙鸭相机”原理分析和手动实现方案

妙鸭相机 一个通过上传大约20张照片&#xff0c;生成专属自拍。在2023年7月末爆火&#xff0c;根据36Kr报道&#xff0c;妙鸭相机系阿里系产品&#xff0c;挂靠在阿里大文娱体系下&#xff0c;并非独立公司。 使用方法是上传20张自拍照片&#xff0c;之后可以选择模板生成自己…

神码ai火车头标题伪原创【php源码】

这篇文章主要介绍了如何把python 代码打包成可执行软件&#xff0c;具有一定借鉴价值&#xff0c;需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获&#xff0c;下面让小编带着大家一起了解一下。 火车头采集ai伪原创插件截图&#xff1a; Python 程序封装-打包成exe程…

以指标驱动,保险、零售、制造企业开启精益敏捷运营的新范式

近日&#xff0c;以“释放数智生产力”为主题的 Kyligence 用户大会在上海前滩香格里拉大酒店成功举行。大会包含上午的主论坛和下午的 4 场平行论坛&#xff0c;并举办了闭门会议、Open Day 等活动。来自金融、零售、制造、医药等行业的客户及合作伙伴带来了超过 23 场主题演讲…

CSS调色网有哪些

本文章转载于湖南五车教育&#xff0c;仅用于学习和讨论&#xff0c;如有侵权请联系 1、https://webgradients.com/ Wbgradients 是一个在线调整渐变色的网站 &#xff0c;可以根据你想要的调整效果&#xff0c;同时支持复制 CSS 代码&#xff0c;可以更好的与开发对接。 Wbg…

selenium 截屏

当前环境&#xff1a; Windows 10 Python 3.7 selenium 3.141.0 Google Chrome 115.0.5790.110 &#xff08;64 位&#xff09; from selenium import webdriver import base64if __name__ __main__:#driver webdriver.Chrome()driver.get(https://www.baidu.com/)# 1.…

服务端高并发分布式结构演进之路

目录 一、常见概念 1.1基本概念 二、架构演进 2.1单机架构 2.2应用数据分离架构 2.3应用服务集群架构 2.4读写分离 / 主从分离架构 2.5引入缓存 —— 冷热分离架构 2.6垂直分库 2.7业务拆分 —— 微服务 一、常见概念 1.1基本概念 应用&#xff08;Application&am…

powerdesigner各种字体设置;preview字体设置;sql字体设置

1.设置左侧菜单&#xff1a; 步骤如下&#xff1a; tools —> general options —> fonts —> defalut UI font ,选择字体样式及大小即可&#xff0c;同下图。 2.设置preview字体大小&#xff08;sql预览&#xff09; 步骤如下&#xff1a; tools —> general o…

问道管理:两市股指冲高回落,沪指一度突破3300点,券商、保险板块领涨

8月4日&#xff0c;两市股指高开高走&#xff0c;沪指一度突破3300点。开盘后&#xff0c;沪指、深成指涨近1%&#xff0c;创业板指、上证50指数涨幅超1%。职业方面&#xff0c;券商、稳妥板块领涨&#xff0c;传媒、石油、半导体、银行、煤炭等板块均上扬&#xff0c;互联金融…

Oracle锁的学习

Oracle数据库中的锁机制 数据库是一个多用户使用的共享资源。当多个用户并发地存取数据时&#xff0c;在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据&#xff0c;破坏数据库的一致性。 在数据库中有两种基本的锁类…