Vue3组件间通信知识整理——子组件向父组件传参

文章介绍了在Vue3中子组件向父组件传递参数的三种方法:1)使用自定义事件`defineEmits`;2)通过回调函数`defineProps`;3)利用`provide`和`inject`进行跨级通信。作者推荐使用第一种方法,认为其具有更好的可读性和通用性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Vue3组件化开发,子组件向父组件传参的场景也是十分之多,通常是用于通知父组件改值,父组件向子组件传递参数。子组件props原则上只读,最好就是通过向父组件传值,调用触发父组件方法达到修改值通信的目的。

子组件向父组件传参

方法一

// 父组件
<script setup>
import { ref } from 'vue'
import childrenTest_oneVue from "./conponents/childrenTest_one.vue";

const str = ref('我是在父组件声明定义的')
const parentClick = (value) => {
  str.value = value
  console.log(value)
}

</script>

<template>
  <div>修改的值在这里: {{ str }}</div>
  <childrenTest_oneVue @changeStr="parentClick"/>
</template>
// -----------------------分界线-------------------------
//子组件

<script setup>
const emit = defineEmits(['changeStr'])

const childClick = (value) => {
  emit('changeStr',value)
}
</script>

<template>
  <button @click="childClick('我来自子组件')">Click me</button>
</template>

浏览器和操作台打印如下⬇

请添加图片描述
这是我最常用的子组件向父组件传值改值的方法,在Vue3的组合式Api写法下,已经不能使用如this.$emit…来实现子传父了,而在setup语法糖下就是使用defineEmit宏指令来声明子组件在父组件的方法行为,也就是自定义事件。

方法二

// 父组件
<script setup>
import childrenTest_oneVue from "./conponents/childrenTest_one.vue";

const parentClick = (value) => {
  console.log(value)
}

</script>

<template>
  <childrenTest_oneVue :handleClick="parentClick"/>
</template>

// -----------------------分界线-------------------------
//子组件

<script setup>
const props = defineProps({
  handleClick: {
    type: Function
  }
})


const childClick = () => {
  props.handleClick('HelloWorld! ')
}

</script>

<template>
  <button @click="childClick">Click me</button>
</template>

操作台打印如下⬇

请添加图片描述

这种子组件向父组件传参的方式就是使用了回调函数,父组件向子组件传递一个回调函数,子组件就可以使用该回调函数作相应的处理。

方法三

按照方法二中使用回调函数实现子传父的思路,是不是使用Vue3中的provideinject也可以实现子传父呢?经过测试应该也是可行的。

// 父组件
<script setup>
import { ref,provide } from 'vue'
import childrenTest_oneVue from "./conponents/childrenTest_one.vue";

const str = ref('我是在父组件声明定义的')
const parentClick = (value) => {
  str.value = value
  console.log(value)
}
provide('parentHandleClick',parentClick)

</script>

<template>
  <div>修改的值在这里: {{ str }}</div>
  <childrenTest_oneVue/>
</template>

//-----------------------分界线---------------------
//子组件

<script setup>
import { inject } from 'vue'
import childrenTest_twoVue from './childrenTest_two.vue'

const childClick = inject('parentHandleClick')

</script>

<template>
  <button @click="childClick('我来自子组件')">Click me One</button>
  <childrenTest_twoVue/>
</template>

//-----------------------分界线---------------------
//孙组件

<script setup>
import { inject } from 'vue'

const childClick = inject('parentHandleClick')

</script>

<template>
  <button @click="childClick('我来自孙组件')">Click me Two</button>
</template>

浏览器和操作台打印如下⬇

初始状态
点击按钮一点击按钮二

provideinject通常是配合使用的,父组件中provide提供一个回调函数,子组件甚至是孙组件都可以接收该回调函数进行传值改值。更多关于provideinject的使用可以看看官方文档https://cn.vuejs.org/guide/components/provide-inject.html#provide

总结

子组件向父组件传参的方法还是比较多的,在不是setup语法糖的写法下,又是略有不同,在重构项目时最常用的就是第一种传值方法,毕竟这是组合式API代替选项式最通用子传父的写法。对于第二、三种方法,我个人是比较少用的,父传子值用defineProps,如果传递的是一个回调函数,会不会容易混淆,导致代码可读性降低呢?使用provideinject会不会有点大材小用呢?对吧,总之考虑专用性方面还是推荐第一种方法吧。

文章有问题之处还望评论斧正!

更多其他组件间通信文章链接放在下方⬇
Vue3组件间通信知识整理——父组件向子组件传参
Vue3组件间通信知识整理——兄弟组件之间通信
Vue3组件间通信知识整理——父组件调用子组件方法

用迅雷或电驴都可以下载! (内含序列号及License) Release 2010a 的新功能 Release 2010a 包括 MATLAB 和 Simulink 的若干新功能丶一款新产品以及对其它 85 款产品的更新和缺陷修复。已经购买 MathWorks 软件维护服务的用户可以下载产品更新。 MATLAB 产品系列的新功能包括: - 增加更多多线程数学函数,增强文件共享丶路径管理功能以及改进 MATLAB 桌面 - 新增用于在 MATLAB 中进行流处理的系统对象,并在Video and Image Processing Blockset 和 Signal Processing Blockset 中提供超过 140 种支持算法 - 针对 50 多个函数提供多核支持并增强性能,并对图像处理工具箱中的大型图像提供更多支持 - 在全局优化工具箱和优化工具箱中提供新的非线性求解器 - 能够从 Symbolic Math Toolbox 中生成 Simscape 语言方程 - 在 SimBiology 中提供随机近似最大期望 (SAEM) 算法和药动学给药方案支持 Simulink 产品系列的新功能包括: - 在 Simulink 中提供可调参数结构丶触发模型块以及用于大型建模的函数调用分支 - 在 嵌入式 IDE 链接和目标支持包中提供针对 Eclipse丶嵌入式 Linux 及 ARM 处理器的代码生成支持 - 在 IEC 认证工具包中提供对 Real-Time Workshop Embedded Coder 和 PolySpace 产品的 ISO 26262 认证 - 在 DO 鉴定工具包中提供扩展至模型的 DO-178B 鉴定支持 - Simulink PLC Coder,用于生成 PLC 和PAC IEC 61131 结构化文本的新产品
python+opencv简谱识别音频生成系统源码含GUI界面+详细运行教程+数据 一、项目简介 提取简谱中的音乐信息,依据识别到的信息生成midi文件。 Extract music information from musical scores and generate a midi file according to it. 二、项目运行环境 python=3.11.1 第三方库依赖 opencv-python=4.7.0.68 numpy=1.24.1 可以使用命令 pip install -r requirements.txt 来安装所需的第三方库。 三、项目运行步骤 3.1 命令行运行 运行main.py。 输入简谱路径:支持图片或文件夹,相对路径或绝对路径都可以。 输入简谱主音:它通常在第一页的左上角“1=”之后。 输入简谱速度:即每分钟拍数,同在左上角。 选择是否输出程序中间提示信息:请输入Y或N(不区分大小写,下同)。 选择匹配精度:请输入L或M或H,对应低/中/高精度,一般而言输入L即可。 选择使用的线程数:一般与CPU核数相同即可。虽然python的线程不是真正的多线程,但仍能起到加速作用。 估算字符上下间距:这与简谱中符号的密集程度有关,一般来说纵向符号越稀疏,这个值需要设置得越大,范围通常在1.0-2.5。 二值化算法:使用全局阈值则跳过该选项即可,或者也可输入OTSU、采用大津二值化算法。 设置全局阈值:如果上面选择全局阈值则需要手动设置全局阈值,对于.\test.txt中所提样例,使用全局阈值并在后面设置为160即可。 手动调整中间结果:若输入Y/y,则在识别简谱后会暂停代码,并生成一份txt文件,在其中展示识别结果,此时用户可以通过修改这份txt文件来更正识别结果。 如果选择文件夹的话,还可以选择所选文件夹中不需要识别的文件以排除干扰
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值