vue3使用ts传参教程

news/2025/10/9 8:19:32/文章来源:https://www.cnblogs.com/spion/p/19130380

在Vue 3中使用TypeScript进行组件间传参是开发中常见的需求,它能提供类型安全和更好的开发体验。以下是Vue 3 + TypeScript组件传参的详细教程:

1. 父组件向子组件传参(Props)

子组件定义Props类型

使用defineProps宏函数并指定类型:

<!-- ChildComponent.vue -->
<template><div><p>姓名: {{ name }}</p><p>年龄: {{ age }}</p><p>爱好: {{ hobbies.join(', ') }}</p></div>
</template><script setup lang="ts">
// 定义props类型
interface Props {name: string;age: number;hobbies?: string[]; // 可选属性
}// 使用defineProps定义并指定类型
const props = defineProps<Props>();// 也可以直接在defineProps中定义类型
// const props = defineProps<{
//   name: string;
//   age: number;
//   hobbies?: string[];
// }>();
</script>

父组件传递参数

<!-- ParentComponent.vue -->
<template><ChildComponent :name="userName" :age="userAge" :hobbies="userHobbies" />
</template><script setup lang="ts">
import ChildComponent from './ChildComponent.vue';const userName = "张三";
const userAge = 25;
const userHobbies = ["读书", "运动"];
</script>

2. 子组件向父组件传参(Emits)

子组件定义Emits类型

<!-- ChildComponent.vue -->
<template><button @click="handleClick">点击发送事件</button>
</template><script setup lang="ts">
// 定义emits类型
const emit = defineEmits<{(e: 'change', value: string): void;(e: 'update', id: number, status: boolean): void;
}>();const handleClick = () => {// 触发事件并传递参数emit('change', '这是传递的字符串');emit('update', 123, true);
};
</script>

父组件接收事件

<!-- ParentComponent.vue -->
<template><ChildComponent @change="handleChange" @update="handleUpdate" />
</template><script setup lang="ts">
import ChildComponent from './ChildComponent.vue';const handleChange = (value: string) => {console.log('收到子组件消息:', value);
};const handleUpdate = (id: number, status: boolean) => {console.log('收到更新事件:', id, status);
};
</script>

3. 双向绑定(v-model)

子组件实现v-model

<!-- ChildComponent.vue -->
<template><input type="text" :value="modelValue" @input="$emit('update:modelValue', $event.target.value)"/>
</template><script setup lang="ts">
// 定义v-model的类型
const props = defineProps<{modelValue: string;
}>();const emit = defineEmits<{(e: 'update:modelValue', value: string): void;
}>();
</script>

父组件使用v-model

<!-- ParentComponent.vue -->
<template><ChildComponent v-model="message" /><p>父组件的值: {{ message }}</p>
</template><script setup lang="ts">
import ChildComponent from './ChildComponent.vue';
import { ref } from 'vue';const message = ref("初始值");
</script>

4. 多个v-model绑定

<!-- ChildComponent.vue -->
<template><input type="text" :value="name" @input="$emit('update:name', $event.target.value)"/><input type="number" :value="age" @input="$emit('update:age', Number($event.target.value))"/>
</template><script setup lang="ts">
const props = defineProps<{name: string;age: number;
}>();const emit = defineEmits<{(e: 'update:name', value: string): void;(e: 'update:age', value: number): void;
}>();
</script>

父组件使用:

<ChildComponent v-model:name="userName" v-model:age="userAge" 
/>

5. 透传属性(Attrs)

当需要传递未在props中定义的属性时,可以使用useAttrs

<script setup lang="ts">
import { useAttrs } from 'vue';const attrs = useAttrs();
// attrs包含所有未在props中声明的属性
console.log(attrs);
</script>

总结

Vue 3 + TypeScript的传参方式主要有:

  • Props:父向子传递数据
  • Emits:子向父传递事件和数据
  • v-model:双向绑定
  • useAttrs:透传未声明的属性

使用TypeScript可以在编译阶段就发现类型错误,提高代码质量和开发效率。在实际开发中,建议为所有props和emits定义明确的类型。

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

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

相关文章

Linux 特殊权限位详解:SetUID, SetGID, Sticky Bit - 实践

Linux 特殊权限位详解:SetUID, SetGID, Sticky Bit - 实践2025-10-09 08:11 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !importan…

pt-table-checksum 原理解析

pt-table-checksum 原理解析在 MySQL 主从复制架构中,“数据一致性” 是业务可靠性的底线,但原生复制仅保证 binlog 的传输与执行,无法规避网络中断、SQL 错误、从库延迟等导致的数据偏差。而 Percona Toolkit 中的…

给别人做网站在那里接单wordpress自定义文章顺序

在机器学习中&#xff0c;模型的表现很大程度上取决于我们如何平衡“过拟合”和“欠拟合”。本文通过理论介绍和代码演示&#xff0c;详细解析过拟合与欠拟合现象&#xff0c;并提出应对策略。主要内容如下&#xff1a; 什么是过拟合和欠拟合&#xff1f; 如何防止过拟合和欠拟…

vue搭建点击按钮input保持聚焦状态

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

如何做自助网站网站报备

产品描述 AP5179是一款连续电感电流导通模式的降压恒流源&#xff0c;用于驱动一颗或多颗串联LED输入电压范围从 5 V 到 60V&#xff0c;输出电流 可达 2.0A 。根据不同的输入电压和 外部器件&#xff0c; 可以驱动高达数十瓦的 LED。 内置功率开关&#xff0c;采用高端电流采样…

带数据库的网站做wordpres做视频网站

想知道你的网站每天的访问情况吗&#xff1f;有多少人访问了&#xff1f;访问最多的页面是哪个&#xff1f;哪个时段访问的人最多&#xff1f;哪个地方访问的最多&#xff1f;每秒有多少请求&#xff1f;很好奇吧&#xff0c;只要你是使用了nginx进行请求抓发&#xff0c;那么就…

解密prompt系列61. 手搓代码沙箱与FastAPI-MCP实战

前两章我们讨论了JupyterAgent,当时用的是E2B的代码沙箱。这次我决定自己动手,用字节的TRAE从头构建一个Python代码沙箱,并加入MCP支持。完整代码已经开源在github.com/DSXiangLi/simple_sandbox最近Vibe Code在各种…

MySQL 高可用构建方案详解

MySQL 高可用构建方案详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", &…

企业网站建设应该注意什么事项问题雁塔区网站建设

曾经做过单片机和以下20种PLC的Modbus RTU串口通信&#xff0c;现将这20种PLC输入、输出和寄存器元件与Modbus编号地址对应表分享出来。三菱FX3G-40MR/ES-A、西门子S7-200 CPU226 AC/DC/RLY、欧姆龙CP1H-X40DR-A、松下AFPX-C40R、台达DVP-12SA2、信捷XC5-48、永宏FBs-40MC、产电…

VMware ESXi 9.0.1.0 macOS Unlocker OEM BIOS 2.7 标准版和厂商定制版

VMware ESXi 9.0.1.0 macOS Unlocker & OEM BIOS 2.7 标准版和厂商定制版VMware ESXi 9.0.1.0 macOS Unlocker & OEM BIOS 2.7 标准版和厂商定制版 ESXi 9.0 标准版,Dell (戴尔)、HPE (慧与)、Lenovo (联想)、…

使用sqlite-loadable-rs开发一个简单sqlite uuid 扩展

使用sqlite-loadable-rs开发一个简单sqlite uuid 扩展默认sqlite 缺少uuid 函数, sqlite-loadable-rs 是一个基于rust包装的框架,可以用来快速开发sqlite 扩展,以下是一个简单测试 项目准备cargo.toml注意当前editio…

C语言数据结构笔记3:Union联合体+结构体取8位Bool量 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

多机器人协同首现基础模型技术突破

某机构研发出首个多机器人协同基础模型DeepFleet,通过Transformer架构处理机器人导航数据,能预测交通模式并提升10%运营效率。该技术利用数十亿小时真实数据训练,包含四种不同架构模型的对比实验。多机器人协同首现…

文登做网站的公司wordpress建英文博客

HTML placeholder 属性实例 1带有 placeholder 文本的两个输入字段&#xff1a;尝试一下 placeholder 文本也可以指定颜色。实例 2带有 placeholder 文本设置颜色&#xff1a;尝试一下 浏览器支持Internet Explorer 10、Firefox、Opera、Chrome 和 Safari 支持 placeholder 属性…

做查询系统网站如何写网站文案

OpenSSL&#xff08;Open Secure Sockets Layer&#xff09;是一个开源的软件库&#xff0c;提供了SSL和TLS协议的实现&#xff0c;用于加密通信。它广泛用于安全连接&#xff0c;例如在网站上通过HTTPS协议进行安全的数据传输. 但是从openssl申请道德证书是不安全的。对于网站…

PHP 图像处理实战 GD/Imagick 从入门到精通,构建高性能图像服务

PHP 图像处理实战 GD/Imagick 从入门到精通,构建高性能图像服务 网页上经常能看到模糊的用户头像、被拉伸变形的卡片图片,还有动辄几 MB 大小的 JPEG 文件。其实这些问题完全可以避免,关键在于建立合适的图像处理流…

上海百度整站优化服务wordpress获取指定图片大小

1. 作用 匹配文档中的某些元素为其应用样式。根据不同需求把不同的标签选出来。 2. 分类 分类 基础选择器 包含 标签选择器、ID选择器、类选择器、通用选择器等 复合选择器 包含 后代选择器、子代选择器、伪类选择器等 1 标签选择器 介绍 又称为元素选择器&#xff0c;根…

湘潭营销网站建设物理机安装虚拟机做网站好处

说明 vue路由切换时&#xff0c;当前页面左侧和右侧容器分别从两侧滑出&#xff0c;新页面左右分别从两侧滑入 效果展示 路由切换-滑入滑出效果 难点和踩坑 现路由和新路由始终存在一个页面根容器&#xff0c;通过<transition>组件&#xff0c;效果只能对页面根容器有效…

完全免费的网站源码做app网站的软件

咳咳&#xff0c;请各位小伙伴们注意啦&#xff01;我们要聊的主题可是相当高大上——小动物呼吸机&#xff01; 我们得先了解一下什么是小动物呼吸机。这可不是一般的机器哦&#xff0c;它是一种实验设备&#xff0c;主要用于各种各样的科学研究实验中。比如&#xff0c;在基…

注销主体和注销网站互联网广告精准营销

因项目原因&#xff0c;公司需要在钉钉里面开发小程序。之前用uniapp开发过app&#xff0c;H5&#xff0c;小程序。还真没尝试过钉钉小程序&#xff0c;今天就简单的记录下uniapp运行钉钉小程序中的过程。 在项目目录新建package.json文件&#xff0c;在文件中添加如下代码&am…