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

2023-11-03

目录

前言

一、基本语法

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 事件。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【超细节】Vue3组件事件怎么声明,defineEmits与emit 的相关文章

随机推荐

  • 数组扁平化和去重

    数组扁平化和去重 引入题目 已知有数组 1 2 2 3 4 5 5 6 7 8 9 11 12 12 13 14 10 扁平化数组后应该得到的数组为 1 2 2 3 4 5 5 6 7 8 9 11 12 12 13 14 10 一 数组扁
  • Android Studio基础输入文本框EditText

    Android Studio基础输入文本框EditText 接续上一节 Android Studio 基础按钮使用 1 提示文本框 输入文本框 在布局xml编写
  • gitlab-ci docker maven 自动化流水线部署 springboot多模块项目

    一 准备 首先 需要两台服务器 这里为了下面方便理解 我们约定这两台服务器地址 名称和系统 1 gitlab 服务器 服务器A 地址10 10 10 7 内存大于4g不然会一直死 CentOS Linux 7 Core 2 springbo
  • 大白话讲懂word2vec原理和如何使用

    前言 做自然语言处理 Natural Language Processing NLP 这个领域的小伙伴们肯定对word2vec这个模型很熟悉了 它就是一种最为常见的文本表示的算法 是将文本数据转换成计算机能够运算的数字或者向量 在自然语言处
  • 八十二.将整数的奇偶位互换(位运算)

    将整数的奇偶位互换 import java util Scanner public class LianXi public static int exchange int i 和10101010 做与运算取出偶数位 int ou i 0xa
  • IDEF1X

    IDEF系列方法是由美国空军的ICAM Integrated Computer Aided Manufacturing 计划中首次提出一种复杂系统分析与设计方法 它包括了功能建模 IDEF0 信息建模 IDEF1 动态建模 IDEF2 数据
  • 如何测网络稳定性_如何测试无线WiFi系统的信号强度?这篇文章告诉你

    前言 在智能化弱电行业中 我们也会接触无线网络覆盖的项目 比如一个酒店 校园 园区 小区的无线网络覆盖 项目部署实施结束之后 我们怎样才能确定这个无线网络系统符合建设标准了 今天我们一起来聊聊 无线网络信号强度的测试方式 正文 无线网络可通
  • 如何构造大根堆

    如何构造一个大顶堆 C实现 基础知识 堆是一种二叉树结构 但是他的物理保存是一个数组 如下图 实际的保存形式为 5 4 1 25 68 8 1 5 2 3 设每个结点下标为i 则左孩子 2i 1 右孩子 2i 2 最后一个非叶子结点 arr
  • 汇编语言——第13章 int指令

    13 1 int指令 int指令的格式为 int n n为中断类型码 它的功能是引发中断过程 CPU执行int n指令 相当于引发一个n号中断的中断过程 执行过程如下 1 取中断类型码n 2 标志寄存器入栈 IF 0 TF 0 3 CS I
  • c#-中级篇知识合集-part01

    c 中级篇知识合集 part01 001 调试和错误处理 002 中断模式下的调试 003 错误处理 异常处理 004 异常处理 案例2 005 面向对象编程 类 006 类的定义和声明 Program cs Vector3 cs Vehi
  • 小鹏前自动驾驶AI负责人刘兰个川转投安克,研发具身智能

    作者 StrongerTang 编辑 自动驾驶Daily 点击下方卡片 关注 自动驾驶之心 公众号 ADAS巨卷干货 即可获取 本文只做学术分享 如有侵权 联系删文 据新智驾消息 小鹏前自动驾驶AI负责人刘兰个川 Patrick 近期已加入
  • 基于FPGA的混沌信号发生器设计与实现

    提出基于FPGA设计混沌信号发生器的一种改进方法 首先 采用Euler算法 将连续混沌系统转换为离散混沌系统 其次 基于IEEE 754单精度浮点数标准和模块化设计理念 利用Quartus II软件 采用VHDL和原理图相结合的方式设计混沌
  • Druid无效链接回收策略(源码分析)(mysql 8小时连接失效问题)

    目录 问题背景 异常Communications link failure druid数据库连接池关键配置说明 注意标红配置 druid数据库连接池超时连接回收源码分析 第一种方式 获取连接时校验 第二种方式 Destroy 定时任务检查需
  • Python中关于序列化的讨论,以及dump、dumps和load、loads区别的对比

    序列化 序列化 pickle模块 json模块 shelve模块一 pickle模块1 pickle模块1 可以将对象转换为一种可以传输或存储的格式 2 pickle模块将任意一个python对象换成一个系统字节的操作过程叫做串行化对象 3
  • buck电路_简单电源(1)从电阻分压、稳压管、线性稳压器到BUCK变换器

    电阻分压就是BUCK降压器最基本的原理 惊讶吧 如果有一个10V的电压 要想得到5V的电压 怎么办 非常简单 用二个阻值相同的电阻R1 R2串联起来 从接地电阻R2上取电压 就直接得到5V电压 图1 串联电阻分压 如果给这个电压加负载 二个
  • element 中 el-date-picker 时间选择器时间跨度设置 7天

    用 el date picker 实现日历的跨度 七天
  • VS中“生成事件”的问题

    转载自 http hi baidu com gisince item 7f0439ee610c94255a2d64b4 今天写了生成事件的处理 如下 从网上Down了一个例子 运行时提示错误 命令 copy F F 已退出 返回值为 1 以
  • win10桌面突然显示未激活

    1 以管理员身份打开cmd C Windows system32 cmd exe 2 输入sfc scannow命令自动修复系统文件 sfc scannow 3 修复完成后重启电脑
  • 2023除夕倒计时~HTML代码

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

    目录 前言 一 基本语法 1 子组件触发 2 父组件监听 二 事件参数 1 传值 2 接收值 三 事件校验 四 注意事项 前言 组件事件是 Vue 组件之间进行通信的一种方式 它允许一个组件触发一个自定义事件 并且其他组件可以监听并响应这个