当前位置: 首页 > news >正文

vue3使用ts传参教程

在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.hskmm.com/?act=detail&tid=27069

相关文章:

  • 解密prompt系列61. 手搓代码沙箱与FastAPI-MCP实战
  • MySQL 高可用构建方案详解
  • VMware ESXi 9.0.1.0 macOS Unlocker OEM BIOS 2.7 标准版和厂商定制版
  • 多机器人协同首现基础模型技术突破
  • PHP 图像处理实战 GD/Imagick 从入门到精通,构建高性能图像服务
  • 2025氧化镁厂家、活性氧化镁厂家、肥料级氧化镁厂家最新推荐榜:实力生产与优质供应之选
  • 2025学校家具定制厂家/书包柜厂家推荐榜:专业设计与安全品质首选
  • 2025农机带厂家最新推荐榜:质量可靠与耐用性能兼备之选
  • 2025深圳电源适配器厂家最新推荐榜:高效耐用与安全认证深度解析
  • 2025试验机厂家最新推荐榜:精准测量与高效检测口碑之选
  • 2025喷砂厂家 / 热喷锌厂家 / 热喷铝厂家 / 油漆涂装厂家 / 热喷耐磨材料厂家 / 防腐工程厂家最新推荐榜:高效作业与优质工艺口碑之选
  • 2025上海经济纠纷律师/民事纠纷律所最新推荐榜:专业辩护与胜诉保障口碑之选
  • Semantic Kernel + AutoGen = 开源 Microsoft Agent Framework
  • 读技术之外:社会联结中的人工智能04数据
  • Potplayer Official Download LINK
  • 二廿计划(25.10.09 - 25.10.29)
  • 生成式AI与计算教育融合研究
  • 博科SAN switch 所有端口的led闪橙色
  • 251008
  • 2025年R系列斜齿轮减速机厂家最新推荐:R系列斜齿轮减速机/F系列平行轴齿轮减速机/K系列螺旋斜齿轮减速机/S系列蜗轮减速机实力厂家精准传动解决方案
  • 2025化工泵厂家权威推荐榜:磁力泵/多级泵/高温泵/混流泵/浆液泵/螺杆泵/陶瓷泵/脱硫泵/旋涡泵/液下泵/轴流泵/自吸泵厂家,高效节能与耐用品质实力之选
  • C语言 strtol() 函数用法
  • 课程作业
  • 国庆七日赛训总结
  • SpringCloud实用篇02-(Nacos配置管理,Feign远程调用,Gateway服务网关) - a
  • 总资料汇总关联化站点形式的尝试(未完成)
  • 8051指令集
  • reLeetCode 热题 100- 76 最小覆盖串 - MKT
  • SpringCloud-01(认识微服务,服务拆分和远程调用,Eureak注册中心,Ribbon负载均衡,Nacos注册中心) - a
  • 算法第一次作业