vue3+vite+ts父子组件之间的传值

vue3+vite+ts父子组件之间的传值

  • 前言
  • 一、父组件向子组件传值
  • 二、子组件向父组件传值
  • 三、非父子组件传值,也就是任意两个组件的传值,和vue2基本相似,这里就不描述了,vue3里面建议大家使用pinia来进行传值。


前言

提示:这里仅描述<script lang="ts" setup>中的写法,另外一种写法的话,基本类似,这里不做展示了

随着vue2的落幕,vue3越来成熟,有必要更新一下vue3的父子组件之间的传值方式,和vue2的大差不差,都是一个道理,只不过写法上出现了差异,vue3+vite+ts安装这里就不写了,由于文章中使用了element-plus的dialog组件作为子组件的内容,所以前提工作是先安装一下element-plus


一、父组件向子组件传值

代码如下(父组件示例):

<script setup lang="ts">
import systemDialog from '../../components/systemDialog.vue'import { reactive, ref } from "vue";const perInfo = reactive([{name: '张三',age: 20},{name: '李四',age: 25},
])
// vue2中的ref,vue3中也一样是使用ref,只不过要定义一下这个变量
const systemDialogref = ref()// 点击doShow这个方法,使用ref的方式将子组件的弹框调用起来,并且传值过去,
const doShow = () => {let str = '这是ref传过去的值'systemDialogref.value.showDialog(str)
}</script><template><div><el-button text @click="doShow">click to open the Dialog</el-button><systemDialog ref="systemDialogref" :perInfo="perInfo" msg="这是一段文本" /></div>
</template><style scoped>
</style>

代码如下(子组件示例):

<script lang="ts" setup>
import { ref } from "vue";
import { ElMessageBox } from "element-plus";// defineProps可以传递多个任意类型的值,类似vue2中的props
defineProps<{ perInfo: Array<any>; msg: string }>();const dialogVisible = ref(false);const handleClose = (done: () => void) => {ElMessageBox.confirm("Are you sure to close this dialog?").then(() => {done();}).catch(() => {// catch error});
};const testData = ref();const showDialog = (val: any) => {testData.value = val;dialogVisible.value = true;
};
// 父组件使用ref调用showDialog方法,用到defineExpose将showDialog抛出去,直接用,不需要引入
defineExpose({showDialog
});
</script><template><div><el-dialog v-model="dialogVisible" title="Tips" width="30%" :before-close="handleClose"><div>下面的v-for循环就是父组件传过来的值</div><div v-for="(item, index) in perInfo" :key="index">名字: {{ item.name }}年龄: {{ item.age }}</div><div>下面是通过ref父组件传给子组件的值</div><div>{{ testData }}</div><template #footer><span class="dialog-footer"><el-button @click="dialogVisible = false">Cancel</el-button><el-button type="primary" @click="dialogVisible = false">Confirm</el-button></span></template></el-dialog></div>
</template><style scoped>
.dialog-footer button:first-child {margin-right: 10px;
}
</style>

注意:父组件代码中的perInfo和msg都是传给子组件的值,由于子组件是一个弹框,要用到ref的方式打开子组件的弹框

二、子组件向父组件传值

代码如下(子组件示例):

<script lang="ts" setup>
import { ref } from "vue";
import { ElMessageBox } from "element-plus";// defineEmits中可以写多个方法
const emit = defineEmits(["send-data"]);
const dialogVisible = ref(false);const handleClose = (done: () => void) => {ElMessageBox.confirm("Are you sure to close this dialog?").then(() => {done();}).catch(() => {// catch error});
};const showDialog = () => {dialogVisible.value = true;
};
// 父组件使用ref调用showDialog方法,用到defineExpose将showDialog抛出去,直接用,不需要引入
defineExpose({showDialog
});
// 触发事件将子组件的值传递给父组件,send-data要在父组件中接收
const change = () => {emit("send-data", "这是子组件传递的一个值");
};
</script><template><div><el-dialog v-model="dialogVisible" title="Tips" width="30%" :before-close="handleClose"><el-button type="danger" plain @click="change">写一个按钮触发将值传给父组件</el-button><template #footer><span class="dialog-footer"><el-button @click="dialogVisible = false">Cancel</el-button><el-button type="primary" @click="dialogVisible = false">Confirm</el-button></span></template></el-dialog></div>
</template><style scoped>
.dialog-footer button:first-child {margin-right: 10px;
}
</style>

代码如下(父组件示例):

<script setup lang="ts">
import systemDialog from '../../components/systemDialog.vue'import { ref } from "vue";// vue2中的ref,vue3中也一样是使用ref,只不过要定义一下这个变量
const systemDialogref = ref()// 点击doShow这个方法,使用ref的方式将子组件的弹框调用起来
const doShow = () => {systemDialogref.value.showDialog()
}const sendData = ref(null)const handleReceivedData = (res: any) => {console.log(res);sendData.value = res
}</script><template><div><el-button text @click="doShow">click to open the Dialog</el-button>{{ sendData }}<systemDialog ref="systemDialogref" @send-data="handleReceivedData" /></div>
</template><style scoped>
</style>

子组件向父组件传值,和vue2的很相似,逻辑也一样,也是用到emit,只不过emit写法不一样

三、非父子组件传值,也就是任意两个组件的传值,和vue2基本相似,这里就不描述了,vue3里面建议大家使用pinia来进行传值。

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

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

相关文章

laravel框架引用kafka

在 Laravel 中操作 Kafka&#xff0c;可以使用 php-rdkafka 扩展或 confluent-kafka-php 扩展。 以下展示如何使用 confluent-kafka-php 扩展来在 Laravel 中使用 Kafka。 操作步骤说明&#xff1a; 1、安装 confluent-kafka-php 扩展。您可以使用 Composer 进行安装&#x…

SpaceDesk如何连接平板/PC(生产力副屏)

1、下载安装 分为安卓端和PC端&#xff0c;两个设备都需要安装对应的软件。 SpaceDesk官网 https://link.zhihu.com/?targethttp%3A//spacedesk.net/ 需要魔法上网。安装过程比较简单&#xff0c;无脑下一步即可。 我已经把安装包准备好了&#xff0c;如果不想自己找&#…

Linux互斥锁pthread_mutex_lock和pthread_mutex_unlock

当一个进程中存在两个及以上的线程时&#xff0c;线程间会互相争夺共享资源&#xff0c;导致单个线程中的执行秩序会被打乱。所以需要用到互斥锁来进行秩序控制&#xff0c;保证单个线程中的程序先执行完毕。 2、创建互斥锁pthread_mutex_init(); int pthread_mutex_init(pth…

k8s之共享存储pvpvc

目录 1.1 存储资源管理 1.2 持久卷pv的类型 1.3 实验mysql基于NFS共享存储实现持久化存储 1.3.1 安装NFS 1.3.2 PV参数详解 1.3.3 创建pv 1.3.4 mysql使用pvc持久卷 1.4 动态绑定pv 1.4.1 配置nfs-provisioner授权 1.4.2 部署nfs-client-provisioner 1.4.3 创建Stor…

35. 常用shell之 df - 磁盘空间使用情况 的用法及衍生用法

df&#xff08;disk free&#xff09;是一个在大多数类 Unix 系统上可用的命令行工具&#xff0c;用于显示文件系统的磁盘空间使用情况。 基本用法 显示所有文件系统的磁盘使用情况: df 这个命令会列出所有挂载的文件系统及其磁盘使用情况。 以人类可读的格式显示信息: df -…

CentOS7 安装 DockerCompose

目录 一、安装Docker 二、安装步骤 2.1 卸载 2.2 安装docker 2.3 启动docker 2.4 配置镜像加速器 一、安装Docker Docker 分为 CE 和 EE 两大版本。 CE 即社区版(免费&#xff0c;支持周期7个月)EE 即企业版强调安全&#xff0c;付费使用&#xff0c;支持周期 24 个月…

Altium Designer切换中文界面与英文界面的方法图文教程及视频演示

目录 视频演示1&#xff0c;概述2&#xff0c;汉化切换为中文界面3&#xff0c;切换为英文界面4&#xff0c;总结 视频演示 Altium Designer软件汉化方法 欢迎点击浏览更多高清视频演示 1&#xff0c;概述 Altium Designer支持汉化界面&#xff0c;本文演示Altium Designer软件…

中奖记录设计(策略+模板)

背景 最近需求要做一个活动需求,用户只要参与活动就可以获得奖励,奖励分为以下几种: 创角奖励: 用户在活动内的游戏创建角色即可中奖 等级奖励: 角色在游戏内级别达到某一个级别即可中奖 VIP级别奖励: 角色在游戏内VIP级别达到某一个级别即可中奖 排行榜奖励: 角色某一天充值榜…

Qt+Vs踩坑之QString转std::string中文乱码

文章目录 1.Qt内部的编码造成的中文乱码2.QString与std::string之间转换造成的中文乱码3.QString、string、char*之间的转换4.参考文献 Qt中字符串存在两种中文乱码的情况&#xff1a;1.Qt内部的编码造成的中文乱码&#xff1b;2.QString与std::string之间转换造成的中文乱码。…

nodejs连接mongodb报错SyntaxError: Unexpected token .

nodejs连接mongodb报错SyntaxError: Unexpected token 如下图 经过排查&#xff0c;原因是npm默认安装的mongodb插件是最新版6.3.0 &#xff0c;而mongodb数据库版本是4.0.0 &#xff0c;两者版本不同导致nodejs报错。 解决方法是npm卸载新版本的mongodb插件&#xff0c;再安…

【Java探索之旅】我与Java的初相识(二):程序结构与运行关系和JDK,JRE,JVM的关系

&#x1f3a5; 屿小夏 &#xff1a; 个人主页 &#x1f525;个人专栏 &#xff1a; Java入门到精通 &#x1f304; 莫道桑榆晚&#xff0c;为霞尚满天&#xff01; 文章目录 &#x1f4d1;前言一. 第一个Java程序1.1 main方法1.2 Java的程序结构 二. Java程序的运行三. JDK、JR…

【YOLOV8追踪篇】使用Ultralytics YOLO进行物体追踪

YOLOV8追踪 目录 一 使用已训练的检测模型进行追踪 二 其他 视频分析领域的物体追踪是一项关键的任务,既能够标识出帧内物体的位置和类别,还能在视频进行的过程中为每个检测到的物体保持一个唯一的ID(追踪)。 Ultralytics YOLOv8相关介绍:

Achronix提供由FPGA赋能的智能网卡(SmartNIC)解决方案来打破智能网络性能极限

作者&#xff1a;Achronix 随着人工智能/机器学习&#xff08;AI/ML&#xff09;和其他复杂的、以数据为中心的工作负载被广泛部署&#xff0c;市场对高性能计算的需求持续飙升&#xff0c;对高性能网络的需求也呈指数级增长。高性能计算曾经是超级计算机这样一个孤立的领域&a…

20 Vue3中使用v-for遍历普通数组

概述 使用v-for遍历普通数组在真实开发中还是比较常见的。 基本用法 我们创建src/components/Demo20.vue&#xff0c;代码如下&#xff1a; <script setup> const tags ["JavaScript", "Vue3", "前端"] </script> <template…

301_C++_字符串解析函数‘strcasestr‘

if ((pctmpA = strcasestr(const_cast<char *>(pcMsg), "MotionAlarm"))&& (pctmpA =

(1)(1.10) SiK Radio v1

文章目录 前言 1 概述 2 连接无线电台 3 参数说明 前言 本文介绍了如何将 3DR Radio v1 连接到飞行控制器。你还应阅读 SiK Radio v2&#xff0c;其中包含更详细的用户指南和功能列表。 1 概述 3DR 无线电设备是在自动驾驶仪和地面站之间建立遥测连接的最简单方法。 3DR…

uniapp怎么跳转页面

在 UniApp 中&#xff0c;你可以使用以下方法来跳转到其他页面&#xff1a; 使用<navigator>标签&#xff1a; <navigator url"/pages/example/example">点击跳转</navigator> 在上面的示例中&#xff0c;点击"点击跳转"会导航到/pag…

Redis高可用性方案:主从复制与哨兵机制详解

大家好&#xff0c;我是升仔 在高可用性数据服务的构建中&#xff0c;Redis扮演着重要的角色。Redis的主从复制和哨兵机制是实现高可用性的关键组件。本文将详细探讨这两种机制的使用场景、配置细节&#xff08;尤其是持久化配置&#xff09;&#xff0c;并讨论相应的异常处理…

常见加解密算法分析(含使用场景)

加密算法主要分为三类&#xff1a;对称加密算法、非对称加密算法和散列算法。下面将分别介绍这些类别中的常见算法及其特点和使用场景。 对称加密算法 1. AES (Advanced Encryption Standard) AES是一种广泛使用的对称加密标准&#xff0c;可以使用128、192和256位的密钥长度…

如何在Android Framework源码中增加jni方法

我们都知道&#xff0c;在Android Framework源码中&#xff0c;有很多这种类型的方法&#xff0c;方法前缀有"public static native",这种方法就是native方法&#xff0c;会调用到jni中去。 如&#xff1a;public static native long getNativeHeapSize(); 那如何在…