Vue3.0组合式API:使用defineEmits()实现子组件向父组件传递数据

news2024/9/20 8:03:18

1、使用 defineEmits() 函数

父组件通过使用 Prop 为子组件传递数据,但如果子组件要把数据传递回去,就需要使用自定义事件来实现。父组件可以通过 v-on 指令(简写形式“@”)监听子组件实例的自定义事件,而子组件可以通过调用内建的 defineEmits() 函数并传入事件名称来触发自定义事件。

使用 <script setup> 语法糖,<script setup> 是在单文件组件 (SFC) 中使用组合式 API 的编译时语法糖。在 Vue3.2 中只需要在 script 标签上加上 setup 属性,无需 return,template 便可直接使用。相比于普通的 <script> 语法,它具有更多优势。

Vue3.0组合式API,组件之间的数据传递:

父传子:使用 defineProps() 函数。

子传父:使用 defineEmits()​ 函数。

为了在声明 props 和 emits 选项时获得完整的类型推导支持,我们可以使用 defineProps() 函数  和 defineEmits() 函数 API,它们将自动地在 <script setup> 中可用:

<script setup>
//父传子
const props = defineProps({
  foo: String
})

//子传父
const emit = defineEmits(['change', 'delete'])
// setup 代码
</script>
  1. defineProps() 函数 和 defineEmits() 函数 都是只能在 <script setup> 中使用的编译器宏。他们不需要导入,且会随着 <script setup> 的处理过程一同被编译掉。
  2. defineProps() 函数 接收与 props 选项相同的值,defineEmits() 函数 接收与 emits 选项相同的值。
  3. defineProps() 函数 和 defineEmits() 函数 在选项传入后,会提供恰当的类型推导。
  4. 传入到 defineProps() 函数 和 defineEmits() 函数 的选项会从 setup 中提升到模块的作用域。因此,传入的选项不能引用在 setup 作用域中声明的局部变量。这样做会引起编译错误。但是,它可以引用导入的绑定,因为它们也在模块作用域内。

defineEmits()​ 函数的语法格式如下:

defineEmits( eventName, […args] )

参数说明:

eventName:传入事件的名称。

 […args]:触发事件传递的参数,该参数是非必选。

【实例】在 <script setup> 语法糖中,使用 defineEmits() 函数,实现子组件向父组件传递数据。

(1)创建 ParentComponent.vue 父组件

<template>
    <fieldset>
        <legend>父组件</legend>
        <h3>父组件接收到子组件传递的数据:</h3>
        <p>博客信息:{{ blogInfo.blogName }}</p>
        <p>博客信息:{{ blogInfo.blogUrl }}</p>

        <!-- 使用组件 -->
        <ChildComponent @receiverData="getBlogInfo" />
    </fieldset>
</template>

<!-- 使用 <script setup> 语法糖 -->
<script setup>
import { reactive } from 'vue';

//引用组件,使用 <script setup> 语法糖引用的组件会自动执行注册
import ChildComponent from '@/components/ChildComponent.vue'

// 使用 reactive 创建响应式的对象
const blogInfo = reactive({});

// 核心代码:接收子组件传递数据的方法
function getBlogInfo(blogName, blogUrl) {
    blogInfo.blogName = blogName;
    blogInfo.blogUrl = blogUrl;
}

</script>

(2)创建 ChildComponent.vue 子组件

<template>
    <fieldset>
        <legend>子组件</legend>
        <button @click="sendData">传递数据给父组件</button>
    </fieldset>
</template>

<!-- 使用 <script setup> 语法糖 -->
<script setup>
import { reactive } from 'vue';

// 使用 reactive 创建响应式的对象
const blogInfo = reactive({
    blogName: '您好,欢迎访问 pan_junbiao的博客',
    blogUrl: 'https://blog.csdn.net/pan_junbiao'
});

//核心代码
const emit = defineEmits(['receiverData']);

function sendData() {
    //核心代码:触发自定义事件,传递数据个父组件
    emit('receiverData', blogInfo.blogName, blogInfo.blogUrl);
}

</script>

 (3)在 App.vue 根组件中,引入父组件

<template>
  <!-- 使用组件 -->
  <ParentComponent />
</template>
 
<script setup>
//引用组件,使用 <script setup> 语法糖引用的组件会自动执行注册
import ParentComponent from '@/components/ParentComponent.vue';

</script>

执行结果:

2、组件事件配合 v-model 指令

如果是在子组件中用户输入数据,我们希望在获取数据的同时发生数据给父组件,这是可以配合 v-model 指令使用。

【实例】子组件中用户输入数据,在父组件中实时获取数据。

(1)修改 ParentComponent.vue 父组件

<template>
    <fieldset>
        <legend>父组件</legend>

        <!-- 使用组件 -->
        <ChildComponent @searchEvent="getSearch" />

        <h3>父组件接收到子组件传递的数据:</h3>
        接收到的搜索关键字:<input type="text" v-model="search" />
    </fieldset>
</template>

<!-- 使用 <script setup> 语法糖 -->
<script setup>
import { ref } from 'vue';

//引用组件,使用 <script setup> 语法糖引用的组件会自动执行注册
import ChildComponent from '@/components/ChildComponent.vue'

// 使用 ref 创建响应式的对象
const search = ref('');

// 核心代码:接收子组件传递数据的方法
function getSearch(keyword) {
    search.value = keyword;
}

</script>

<style>
input {
    width: 300px;
    padding: 3px;
    font-size: 16px;
}
</style>

(2)修改 ChildComponent.vue 子组件

<template>
    <fieldset>
        <legend>子组件</legend>
        搜索:<input type="text" v-model="search" />
    </fieldset>
</template>

<!-- 使用 <script setup> 语法糖 -->
<script setup>
import { ref, watch } from 'vue';

// 使用 ref 创建响应式的对象
const search = ref('');

//核心代码
const emit = defineEmits(['searchEvent']);

//watch监听器
watch(search, (newValue, oldValue) => {
    //核心代码:触发自定义事件,传递数据个父组件
    emit('searchEvent', newValue);
});

</script>

执行结果:

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

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

相关文章

大数据Flink(一百二十一):Flink CDC基本介绍

文章目录 Flink CDC基本介绍 一、什么是CDC 二、CDC的实现机制 三、​​​​​​​​​​​​​​传统 CDC ETL 分析 四、​​​​​​​​​​​​​​基于 Flink CDC 的 ETL 分析 五、​​​​​​​​​​​​​​什么是 Flink CDC 六、​​​​​​​​​​​​​​…

KeyError: u‘2‘

字典键的定义跟要求不一致 如&#xff1a;digit‘23’ (字符串&#xff09; 定义字典时 dict1{‘1’:X, ‘2’:X} 而不是dict1{1:X, 2:X}

8.2Roberts算子边缘检测

基本概念 Roberts算子是一种简单的一阶导数边缘检测算子&#xff0c;它通过计算图像在水平和垂直方向上的梯度来检测边缘。在OpenCV中&#xff0c;Roberts算子可以通过手动应用卷积核来实现。Roberts算子是一组2x2的小型滤波器&#xff0c;用于检测图像中的垂直和水平边缘。 …

飞睿智能UWB BLE Tag蓝牙防丢器模块,APP测距定位一键绑定,安全守护每一刻

我们总在不经意间与生活中的小物件擦肩而过——钥匙遗忘在咖啡厅的角落&#xff0c;钱包遗失在拥挤的地铁&#xff0c;甚至孩子的书包在人群中悄然消失……每一次的失而复得都是幸运的眷顾&#xff0c;但更多的是遗憾与不便。今天&#xff0c;就让我带你走进一个智能守护的新世…

【Python报错已解决】AttributeError: ‘WindowsPath‘ object has no attribute ‘rstrip‘

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 专栏介绍 在软件开发和日常使用中&#xff0c;BUG是不可避免的。本专栏致力于为广大开发者和技术爱好者提供一个关于BUG解决的经…

鸿蒙OpenHarmony【轻量系统芯片移植】轻量系统STM32F407芯片移植案例

轻量系统STM32F407芯片移植案例 介绍基于STM32F407IGT6芯片在拓维信息[Niobe407]开发板上移植OpenHarmony LiteOS-M轻量系统&#xff0c;提供交通、工业领域开发板解决方案。移植架构采用Board与SoC分离方案&#xff0c;使用arm gcc工具链Newlib C库&#xff0c;实现了lwip、l…

基于动态顺序表实现病历存储项目

基于动态顺序表实现通讯录项目https://blog.csdn.net/Eristic0618/article/details/135718230?spm1001.2014.3001.5506 原文在这里嗷&#xff0c;我进行了小小修改&#xff0c;快去关注这位佬。阿瑾0618https://blog.csdn.net/Eristic0618?typeblog &#xff08;1&#xff…

百度Android IM SDK组件能力建设及应用

作者 | 星途 导读 移动互联网时代&#xff0c;随着社交媒体、移动支付、线上购物等行业的快速发展&#xff0c;对即时通讯功能的需求不断增加。对于各APP而言&#xff0c;接入IM SDK&#xff08;即时通讯软件开发工具包&#xff09;能够大大降低开发成本、提高开发效率&#…

rocky9.2的lvs的NAT模式下的基本使用的详细示例

文章目录 前言什么是LVS?&#xff08;Linux Virtual Server&#xff09;LVS的组成1. 负载均衡器&#xff08;Load Balancer&#xff09;2. 后端服务器池&#xff08;Real Servers&#xff09;3. IPVS&#xff08;IP Virtual Server&#xff09;4. 调度算法&#xff08;Schedul…

Windows 常用的键盘快捷键总结

在日常工作或学习中&#xff0c;使用键盘快捷键不仅能够显著提高操作速度&#xff0c;还可以减少对鼠标的依赖&#xff0c;提升整体工作效率。Windows 操作系统为用户提供了众多功能强大的键盘快捷键&#xff0c;覆盖了不同方面&#xff0c;下面就给大家总结了常用的键盘快捷键…

15. 三数之和(左右指针)

算法分析&#xff1a; 数组排序&#xff1a;先将数组排序&#xff0c;时间复杂度 O(NlogN)。 固定一个数&#xff0c;双指针查找&#xff1a; 用一个循环固定第一个数 nums[i]。在剩余的部分&#xff0c;使用双指针 left 和 right 来寻找符合条件的三元组。 跳过重复元素(注意…

javascript-原型和原型链

原型 每个函数都有一个默认的原型对象 - prototype ,通过 prototype 我们可以扩展 js 的内置对象。一个函数和它创建的实例共享这个函数的原型属性和方法。实例对象的 constructor 会指向构造函数 原型链 每个实例对象都会有一个隐式原型属性 __proto__,通过 __proto__ 指…

单细胞BCR的分析Dandelion重注释的安装以及用法----11111

今天来学习下这个新的方法&#xff0c;主要是针对单细胞BCR 首先安装singularity Singularity 是一种容器化技术&#xff0c;类似于 Docker&#xff0c;专为高性能计算&#xff08;HPC&#xff09;和科学研究领域的需求设计。它允许用户在不同环境中运行和移植应用程序&#x…

【Canvas与诗词】《登科后》唐.孟郊

【成图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>昔日龌龊不足夸</title><style type"text/css"&g…

线程 - 线程优缺点、线程自有和共享的数据、多线程使用公共空间、线程分离、线程库对线程的管理

文章目录 一、线程的优点1. 创建的代价2. 切换的代价缓存和进程/线程切换3. 占用的资源4. 效率二、线程的缺点1. 性能损失2. 健壮性降低3. 缺乏访问控制4. 编程难度高三、线程分离1. 线程分离2. pthread_detach ()① 函数细节② 函数使用四、线程自有和共享的数据1. 线程自有的…

[数据集][目标检测]无人机飞鸟检测数据集VOC+YOLO格式6647张2类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;6647 标注数量(xml文件个数)&#xff1a;6647 标注数量(txt文件个数)&#xff1a;6647 标注…

酒店布草洗涤-酒店分层管理编程实现--———未来之窗行业应用跨平台架构

一、添加楼层代码 未来之窗_人工智能_传送阵(添加楼层,客户信息,300,200) CyberWin_Dialog.layer(未来之窗传送,{type:"url",title:title,move:true,width:阵眼宽度"px",height:阵眼高度"px",id:未来之窗app_通用ID,mask:false,align:59,hidecl…

css 样式简单学习(一)

目录 1. css 介绍 1.1 css 样式 1.2 css代码风格 1.2.1 书写格式 1.2.2 样式大小写​编辑 1.2.3 空格规范 2. 基础选择器 2.1 选择器的作用​编辑 2.2 选择器的分类 2.3 基础选择器 2.3.1 标签选择器​编辑 2.3.2 类选择器​编辑 2.3.3 类选择器-多类名​编辑 2.…

Linux硬连接、软连接和复制的区别

‌硬连接、软连接和复制在Linux系统中的主要区别体现在以下三点&#xff1a; 文件链接的方式文件独立性文件系统的操作上。‌ 一、硬连接 1. 硬连接是通过ln命令创建的&#xff0c;它为文件创建别名&#xff0c;与源文件共享同一inode号码&#xff0c;因此硬连接和源文件实际…

松散绑定是什么?

概念 比如我的yml中写的last-name,这个和lastName是一样的&#xff0c;-后面跟着的字母默认是大写的&#xff0c;这就是松散绑定 示例 类代码&#xff1a; public class Person {private String lastName;private Integer age;private Boolean happy;private Date birth;pr…