vue3-深入组件-事件

news/2024/7/10 1:31:11 标签: 前端, javascript, vue.js, vue

触发与监听事件

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

定义与使用格式规范:

camelCase(小驼峰命名形式)比如:changeStatus

<!-- MyComponent -->
<button @click="$emit('changeStatus')">click me</button>

在父组件中使用 kebab-case 形式使用

<MyComponent @change-status="callback" />

同样,组件的事件监听器也支持 .once 修饰符:

<MyComponent @some-event.once="callback" />

和原生 DOM 事件不一样,组件触发的事件没有冒泡机制。你只能监听直接子组件触发的事件。

平级组件或是跨越多层嵌套的组件间通信

  • 应使用一个外部的事件总线

  • 或是使用一个全局状态管理方案。

事件参数

有时候我们会需要在触发事件时附带一个特定的值。

定义一个子组件,传参数为 1

<!-- MyButton -->
<button @click="$emit('addNum', 1)">
  Increase by 1
</button>

父组件使用内联的箭头函数监听

<MyButton @add-num="(n) => count += n" />

父组件也可使用组件方法来作为事件处理函数:

<MyButton @add-num="addNum" />

function addNum(n) {
  count.value += n
}

所有传入 $emit() 的额外参数都会被直接传向监听器。

声明触发的事件

组件可以显式地通过 defineEmits() 宏来声明它要触发的事件

<script setup>
const emit = defineEmits(['inFocus', 'submit'])

function buttonClick() {
  emit('submit')
}
</script>

尽管事件声明是可选的,我们还是推荐你完整地声明所有要触发的事件,以此在代码中作为文档记录组件的用法。

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

事件校验

和对 props 添加类型校验的方式类似,所有触发的事件也可以使用对象形式来描述。

要为事件添加校验,那么事件可以被赋值为一个函数,接受的参数就是抛出事件时传入 emit 的内容,返回一个布尔值来表明事件是否合法。

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

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

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

http://www.niftyadmin.cn/n/5347285.html

相关文章

【数学笔记】一元n次不等式,分式不等式,绝对值不等式

不等式 基本性质 一元n次不等式一元二次不等式一元高次不等式分式不等式绝对值不等式 基本性质 性质 a > b ⇔ b < a a>b\Leftrightarrow b<a a>b⇔b<a a > b , b > c ⇒ a > c a>b,b>c\Rightarrow a>c a>b,b>c⇒a>c a > b ,…

TS基础知识点快速回顾(下)

上期回顾&#xff1a;TS基础知识点快速回顾(上)-CSDN博客 ⾃定义类型 ⾃定义类型&#xff0c;可以更灵活的限制类 // 性别的枚举 enum Gender {Male,Female } // ⾃定义⼀个年级类型&#xff08;⾼⼀、⾼⼆、⾼三&#xff09; type Grade 1 | 2 | 3 // ⾃定义⼀个学⽣类型 typ…

亚马逊自养号测评的风险有哪些?卖家该如何结合测评提高产品权重!

随着跨境电商行业的发展&#xff0c;越来越多的卖家希望进入亚马逊这个平台。因此&#xff0c;亚马逊在跨境电商市场中的竞争力也随之上升。现如今&#xff0c;亚马逊已经成为众多跨境电商卖家所熟知。 在亚马逊平台上&#xff0c;Review对卖家账号的评估以及产品Listing的曝光…

Python基础(二十九、pymsql)

文章目录 一、安装pymysql库二、代码实践1.连接MySQL数据库2.创建表格3.插入数据4.查询数据5.更新数据6.删除数据 三、完整代码示例四、结论 使用Python的pymysql库可以实现数据存储&#xff0c;这是一种连接MySQL数据库的方式。在本篇文章中&#xff0c;将详细介绍如何使用pym…

ChatGPT 和文心一言 | 两大AI助手哪个更胜一筹

欢迎来到英杰社区&#xff1a; https://bbs.csdn.net/topics/617804998 欢迎来到阿Q社区&#xff1a; https://bbs.csdn.net/topics/617897397 &#x1f4d5;作者简介&#xff1a;热爱跑步的恒川&#xff0c;致力于C/C、Java、Python等多编程语言&#xff0c;热爱跑步&#xff…

14.java集合

文章目录 概念Collection 接口概念示例 Iterator 迭代器基本操作&#xff1a;并发修改异常增强循环遍历数组&#xff1a;遍历集合&#xff1a;遍历字符串&#xff1a;限制 list接口ListIteratorArrayList创建 ArrayList&#xff1a;添加元素&#xff1a;获取元素&#xff1a;修…

React16源码: React中commit阶段的invokeGuardedCallback的源码实现

invokeGuardedCallback 1 &#xff09;概述 在 commit 阶段中在 DEV 环境中调用了 invokeGuardedCallback 这个方法这个方法是在开发过程中被使用&#xff0c;用于捕获错误&#xff0c;协助开发调试的方法 2 &#xff09;概述 定位到 packages/shared/ReactErrorUtils.js#L4…

shell脚本——条件语句与循环语句

目录 一、条件语句 1、test命令测试条件表达式 2、整数数值比较 3、字符串比较 4、逻辑测试&#xff08;短路运算&#xff09; 5、双中括号 二、if语句 1、 分支结构 1.1 单分支结果 1.2 双分支 1.3 多分支 2、case 一、条件语句 条件测试&#xff1a;判断某需求是…