defineProps、defineEmits、 defineExpose的TS写法

news2024/12/23 7:50:34

小满视频
在这里插入图片描述

1 defineProps:父向子传递数据

作用:父组件向子组件传递数据

1.1 传递纯类型参数的方式来声明

父组件中的代码:

父组件App.vue
<template>
  <div>
    <span>传递给子组件的响应式数据:</span><input type="text" v-model="sendData">
    <hr>
    <!-- 2. 使用子组件,添加要传递的数据 -->
    <props :sendData="sendData" a="非响应式数据"></props>
  </div>
</template>

<script setup lang="ts">
import {ref} from 'vue'
// 1. 引入子组件props
import props from './components/props.vue'
const sendData = ref('')

</script>

子组件代码:

子组件props.vue
<template>
  <div>
    <p>子组件接收到的数据:</p>
    <!-- 4. 插值语法,使用子组件数据 -->
    <p>非响应式:{{ a }}</p>
    <p>响应式:{{ sendData }}</p>
  </div>
</template>

<script setup lang="ts">
import {defineProps} from 'vue'
// 3. 使用defineProps接受父组件传递来的数据
defineProps<{
  a:string,
  sendData:string
}>()
</script>

在这里插入图片描述

1.2 传递数据设置默认值

父组件代码:

父组件App.vue
<template>
  <div>
    <span>传递给子组件的响应式数据:</span><input type="text" v-model="sendData">
    <hr>
    <!-- 2. 使用子组件,添加要传递的数据 -->
    <props :sendData="sendData" a="非响应式数据"></props>
  </div>
</template>

<script setup lang="ts">
import {ref} from 'vue'
// 1. 引入子组件props
import props from './components/props.vue'
const sendData = ref() // 为了演示默认值,修改了这里,在ts中应该指定类型 

</script>


子组件代码:

子组件props.vue
<template>
  <div>
    <p>子组件接收到的数据:</p>
    <!-- 4. 插值语法,使用子组件数据 -->
    <p>非响应式:{{ a }}</p>
    <p>响应式:{{ sendData }}</p>
  </div>
</template>

<script setup lang="ts">
import {defineProps} from 'vue'
// 3. 使用defineProps接受父组件传递来的数据
// 只有在使用ts时才能使用withDefaults
withDefaults(defineProps<{
  a:string,
  sendData:string
}>(),{
  sendData:'默认值'
})
</script>


在这里插入图片描述

2 defineEmits:子向父传递数据

2.1 使用defineEmits定义事件

子组件代码:

子组件son1.vue
<template>
    <div>
        子组件<br>
        <input type="text" v-model="msg1"><br>
        <input type="text" v-model="msg2"><br>
        <!-- 2. 定义一个点击事件 -->
        <button @click="sendToF">第一种发送方式</button>
        <!-- 或者第2步和第3步写在一起. 直接在@click事件中使用emit触发事件clickSend,并传递参数 -->
        <button @click="emit('clickSend',[msg1,msg2])">第二种发送方式</button>
    </div>
</template>

<script setup lang="ts">
import { ref } from "vue";

const msg1 = ref<string>('')
const msg2 = ref<string>('')
// 1. 使用defineEmits定义一个事件名称
const emit = defineEmits(['clickSend'])

// 3. 在点击事件中使用emit触发事件clickSend,并传递参数
const sendToF = () => {
    emit('clickSend',msg1.value)
}
</script>

父组件代码:

父组件App.vue
<template>
    <div>
        父组件
        <div>子组件传来的数据:{{ getData }}</div>
        <hr>
        <!-- 4. 在父组件中使用@符号绑定子组件中的定义的事件 -->
        <son1 @clickSend="son1Data"></son1>
        
    </div>
</template>

<script setup lang="ts">
import { ref } from "vue";
import Son1 from "./components/son1.vue";
const getData = ref<string>('')
// 5. 事件触发后,参数中的值就是子组件传过来的值
const son1Data = (data:string) => {
  getData.value = data
}
</script>

第一种发送方式只发送了一个字符串
第二种发送方式发送了一个数组

在这里插入图片描述

2.2 传递纯类型参数的方式来声明

子组件代码:

子组件son1.vue
<template>
  <div>
    子组件<br />
    <input type="text" v-model="msg1" /><br />
    <input type="text" v-model="msg2" /><br />
    <button @click="sendToF">发送</button>
  </div>
</template>

<script setup lang="ts">
import { ref } from "vue";

const msg1 = ref<number|"">("");
const msg2 = ref<string>("");
// ts的定义方式
const emit = defineEmits<{
  change: [msg1: number|""]; // 具名元组语法
  update: [msg2: string];
}>();
// ts的另一种定义方式
/*
const emit = defineEmits<{
  (e: 'change', id: number): void
  (e: 'update', value: string): void
}>()
*/
const sendToF = () => {
    emit("change", msg1.value);
    emit("update", msg2.value);
}
</script>

父组件代码:

父组件App.vue
<template>
    <div>
        父组件:
        <div>子组件第一个参数:{{ getData1 }}</div>
        <div>子组件第二个参数:{{ getData2 }}</div>
        <hr>
        <!-- 4. 在父组件中使用@符号绑定子组件中的定义的事件 -->
        <son @change="msg1" @update="msg2"></son>
        
    </div>
</template>

<script setup lang="ts">
import { ref } from "vue";
import Son from "./components/son.vue";
const getData1 = ref<number|"">("")
const getData2 = ref<string>()
const msg1 = (msg: number|"") => {
    getData1.value = msg
}
const msg2 = (msg: string) => {
    getData2.value = msg
}
</script>

3 defineExpose:子向父暴露

  • 默认情况下,就算通过引用可以获取到子组件实例,也没有办法获取到子组件中定义的属性和方法
  • 子组件可以主动的向外暴露自己的属性和方法

子组件代码

子组件props.vue
<template>
    <div>
        子组件
    </div>
</template>

<script setup lang="ts">
import { ref } from "vue";
const sonData = ref("子组件数据");
const sonFun = () => {
    console.log("子组件方法");
}
// 1. 子组件向外暴露组件中的数据和方法
defineExpose({
    sonData,
    sonFun,
    changeSonData: () => {
        sonData.value = "子组件暴露的数据被修改";
    }
})
</script>

父组件代码:

父组件App.vue
<template>
  <div>
    <!-- 4. 使用子组件的数据 -->
    子组件向外暴露的数据:{{ sonVue?.sonData }}
    <br>
    <!-- 4. 调用子组件的方法,修改子组件的数据,在父组件中无法直接修改子组件的数据 -->
    <button @click="sonVue?.changeSonData()">修改子组件数据</button>
    <hr>
    <!-- 2. 通过ref属性将sonVue与Son组件关联起来 -->
    <Son ref="sonVue"></Son>
  </div>
</template>

<script setup lang="ts">
import { ref, onMounted } from "vue";
import Son from "./components/son.vue";
// 3. 使用ref创建一个指向Son组件实例的引用
const sonVue = ref<InstanceType<typeof Son>>();

onMounted(() => {
  // 4. 直接调用子组件方法需要在组件被挂载完毕的时候调用
  sonVue.value?.sonFun();
});
</script>

const sonVue = ref<InstanceType< typeof Son>>();
1. Son: 子组件。
2. typeof Son: 表示 Son 组件的类型。
3. InstanceType< typeof Son>: 获取 Son 组件实例的类型。
4. ref<InstanceType< typeof Son>>: 创建一个响应式的引用,其值将是 Son 组件的一个实例。

在 Vue 中,InstanceType 是一个 TypeScript 的实用工具类型,它用于获取类 T 的实例类型。当你定义了一个 Vue 组件并通过 ref 来持有这个组件的实例时,可以使用 InstanceType 来准确地指定类型的实例。
在这里插入图片描述

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

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

相关文章

【循环顺序队的实现】

1.队列的逻辑结构 与 抽象数据类型定义 先进先出的线性表 在顺序队列中&#xff0c;我们使用头指针front指向队首元素&#xff1b;用尾指针rear指向队尾元素的下一个位置&#xff08;当然这里的指针是用下标模拟出来的&#xff09; 同时顺序队列中的元素当然是用数组来存储的 …

【系统架构设计】嵌入式系统设计(1)

【系统架构设计】嵌入式系统设计&#xff08;1&#xff09; 嵌入式系统概论嵌入式系统的组成硬件嵌入式处理器总线存储器I/O 设备与接口 软件 嵌入式开发平台与调试环境交叉平台开发环境交叉编译环境调试 嵌入式网络系统嵌入式数据库管理系统实时系统与嵌入式操作系统嵌入式系统…

【Qt笔记】QToolButton控件详解

目录 一、前言 二、QToolButton的基本特性 2.1 图标和文本 2.2 自动提升 2.3 下拉菜单 2.4 工具提示 2.5 弹出模式 三、高级功能 3.1 自定义大小与形状 3.2 检查框与单选按钮 3.3 动画效果 四、常用方法与信号槽 常用方法 信号槽 五、实际应用示例 说明 六、总…

ESP32 CYD 使用 LVGL 在屏幕上显示图像 | Random Nerd Tutorials

在本指南中&#xff0c;你将学习如何使用LVGL在ESP32 Cheap Yellow Display (CYD) 板上处理和加载图像。ESP32将使用Arduino IDE进行编程。 对ESP32 Cheap Yellow Display不熟悉&#xff1f; 从这里开始&#xff1a;开始使用ESP32 Cheap Yellow Display Board – CYD (ESP32-2…

线性代数 第三讲 线性相关无关 线性表示

线性代数 第三讲 线性相关无关 线性表示 文章目录 线性代数 第三讲 线性相关无关 线性表示1.向量运算1.线性相关与线性无关1.1 线性相关与线性无关基本概念 2.线性表示&#xff08;线性组合&#xff09;3.线性相关无关与线性表示的定理大总结3.1 向量β可由向量组线性表出的同义…

心觉:潜意识显化很简单,只是很多人想复杂了

很多人知道潜意识的力量很大&#xff0c;是意识力量的30000倍以上 也知道该怎么显化自己的潜意识 但是就是做不到 这就像很多肥胖的人知道运动可以减肥 知道减肥之后就可以穿漂亮的衣服 知道减肥之后自己有多帅多美 但是就是迈不开腿 根本原因是你的潜意识和意识上的认知不…

RenderMan v26.2更新内容!云渲染平台支持新版本

皮克斯的最新RenderMan v26.2版本带来了一系列激动人心的新特性和改进&#xff0c;进一步巩固了其在高端渲染领域的领导地位&#xff0c;为艺术家们提供了更丰富的创意工具和更流畅的工作流程。作为老牌的云渲染农场&#xff0c;瑞云依然支持新版本的使用。 RenderMan v26.2更新…

移动端视频编辑SDK解决方案,关键帧曲线塑造生动效果

美摄科技&#xff0c;作为移动视频编辑技术的领航者&#xff0c;携其革命性的移动端视频编辑SDK解决方案&#xff0c;正以前所未有的创新力&#xff0c;为视频创作者们开启了一扇通往无限创意的大门。 重塑视频编辑体验&#xff0c;让创意触手可及 美摄科技的移动端视频编辑S…

公网信息泄露监测(网盘、暗网、搜索引擎、文档平台)思路分享

一、背景 众测项目中白帽可能会提交一些信息泄露漏洞&#xff0c;同时甲方可会收到一些白帽提交的公网信息泄露文件漏洞&#xff0c;例如百度网盘被员工分享某些文件或者某些包含敏感信息的文件可以通过如谷歌、百度等搜索引擎通过特定语法搜索到。为了可以及时发现泄露的文件…

九泰智库 | 医械周刊- Vol.54

⚖️ 法规动态 国家药监局综合司发布医疗器械管理法草案征求意见稿 国家药监局综合司发布了《中华人民共和国医疗器械管理法&#xff08;草案征求意见稿&#xff09;》&#xff0c;公开征求意见&#xff0c;以加强医疗器械的管理并推动产业高质量发展。该草案共十一章190条&a…

深入解析财务报表:掌握重要财务指标的技巧

一、概述 财务报表中有大量信息&#xff0c;如果我们在分析时缺乏明确的方向或忽视了重点&#xff0c;就很容易在繁杂的数据中迷失方向。本文将深入探讨财务报表中的几个重要指标&#xff0c;帮助大家更有针对性地理解这些内容&#xff0c;包括如何分析资产负债率、解读净资产…

基于python的web框架 Flask 入门基础知识【1】

Flask是一个轻量级的可定制框架&#xff0c;使用Python语言编写&#xff0c;较其他同类型框架更为灵活、轻便、安全且容易上手。 目录 一、项目环境搭配以及安装运行 1.下载安装 2.最小的应用 3.运行应用 4.运行结果 4.1 外部可见的服务器 二、路由 三、http请求 3.1静…

无人机的核心技术!!!

无人机的核心技术涵盖了多个关键领域&#xff0c;这些技术共同支撑了无人机的稳定飞行、精准控制、高效数据传输以及多样化的应用功能。 1. 飞行控制技术 核心地位&#xff1a;飞行控制技术是无人机的核心关键技术之一&#xff0c;它确保了无人机在复杂飞行环境下的稳定性和安…

论文AI生成软件大PK!揭秘学术界的高效神器,选对了让你研究效率翻倍

在当今的学术界&#xff0c;研究与写作的压力不断攀升&#xff0c;论文的质量与数量往往成为衡量学者成就的重要指标。 然而&#xff0c;面对繁杂的研究任务和紧张的时间线&#xff0c;如何提升学术生产力成为了广大研究人员、学生及教育工作者的共同诉求。 在这样的背景下&a…

了解 JavaScript SEO

如果您是 SEO 专家&#xff0c;而不是开发人员&#xff0c;那么您可能不需要深入了解网站开发的所有复杂性。但是您确实需要了解基础知识&#xff0c;因为网站的编码方式对其性能有很大影响&#xff0c;因此对 SEO 潜力有很大影响。在关于 HTML 标签的文章中&#xff0c;我们介…

CTFHub SSRF靶场通关攻略(6-11)

FastCGI协议 首先写一个php的一句话木马&#xff0c;并进行base64编码 <?php eval($_POST[cmd]);?> 编码完成后把他写入shell.php文件中 echo "PD9waHAgQGV2YWwoJF9QT1NUW2NtZF0pOz8" | base64 -d > shell.php 使用Gopherus工具生成payload: 执命令 …

中国卫星影像图Level5

卫星地图&#xff0c;又称“卫星遥感图像或是卫星影像”&#xff0c;顾名思义&#xff0c;是借助卫星为媒介&#xff0c;向用户真实反馈地球地表面貌的图像。与传统意义的地图不同&#xff0c;卫星地图上看到的地表面貌是真实而实时的&#xff0c;因此&#xff0c;卫星地图的使…

2024-8-28作业C++/QT

代码&#xff1a; #include <iostream> #include <cstring> #include <array> #include <iomanip> using namespace std; int main() { //array<char,128> a; //array<char,128>::iterator iter; string str; getline(c…

工信部人工智能证书在哪报名?报名入口!

证书出台背景&#xff1a; 为进一步贯彻落实中共中央印发《关于深化人才发展体制机制改革的意见》和国务院印发《关于“十四五”数字经济发展规划》等有关工作的部署要求&#xff0c;深入实施人才强国战略和创新驱动发展战略&#xff0c;加强全国数字化人才队伍建设&#xff0…

探索音视频SDK在软件集成与私有化部署中的技术难题与解决策略

随着数字化转型的加速&#xff0c;音视频通信已成为众多行业不可或缺的一部分&#xff0c;从在线教育到企业协作&#xff0c;从电商直播到远程医疗&#xff0c;音视频SDK&#xff08;软件开发工具包&#xff09;作为实现这些功能的核心技术&#xff0c;其重要性日益凸显。然而&…