vue3 ts defineProps、defineEmits、defineExpose、defineOptions、defineSlots

请添加图片描述


文章目录

  • 前言
  • 一、defineProps
  • 二、defineEmits
  • 三、defineExpose
  • 四、defineOptions( Vue3.3 新特性)
  • 五、defineSlots(Vue3.3 新特性)


前言

本章我们来讲解vue3 ts 中 defineProps、defineEmits、defineExpose、defineOptions、defineSlots的使用及作用。
在Vue3中,defineProps、defineEmits、defineExpose、defineOptions、defineSlots是一组新的功能函数,用于定义组件的属性、事件、暴露、选项和插槽。

defineProps:用于定义组件的属性。通过调用该函数,可以声明组件的属性,并且将属性的类型、默认值等信息进行声明。这样,可以在组件内部通过props属性来接收父组件传递的属性值。

defineEmits:用于定义组件的事件。通过调用该函数,可以声明组件所触发的事件,并且将事件的名称、参数等信息进行声明。这样,可以在组件内部通过$emit方法来触发自定义事件。

defineExpose:用于定义组件的暴露。通过调用该函数,可以将组件内部的属性或方法暴露给父组件。这样,父组件可以直接访问和调用子组件的内部属性和方法。

defineOptions:用于定义组件的选项。通过调用该函数,可以定义组件的各种选项,如生命周期钩子函数、组件的配置项等。

defineSlots:用于定义组件的插槽。通过调用该函数,可以在组件中定义插槽,并且将插槽的名称、内容等信息进行声明。这样,可以在组件的模板中通过标签来插入父组件传入的内容。


提示:以下是本篇文章正文内容,下面案例可供参考

一、defineProps

defineProps是Vue 3中的一个函数,它的作用是定义组件的属性,类似于Vue 2中的props选项。

使用defineProps可以明确指定组件需要接收的属性以及它们的类型、默认值等。这样一来,在组件的使用处,我们就能清晰地看到它所需要的属性,并且能够按照指定的类型进行验证。

使用场景包括但不限于以下情况:

  • 当需要明确指定组件的属性及其类型、默认值时,可以使用defineProps来定义。
  • 当需要在组件的使用处清晰地看到其需要的属性,并按约定的类型进行验证时,可以使用defineProps来定义。
  • 当组件的属性较多且复杂时,使用defineProps可以更好地管理和组织属性的定义。

使用场景示例代码如下:

<template><div><h1>{{ title }}</h1><p>{{ description }}</p></div>
</template><script setup>
import { defineProps } from 'vue';defineProps({title: String,description: {type: String,default: 'This is the component description.',},
});
</script>

在上面的示例中,我们使用了 <script setup> 语法糖来编写组件的逻辑部分。在 defineProps 中我们定义了两个属性:titledescriptiontitle 的类型被指定为 String,而 description 的类型被指定为 String,并且还定义了一个默认值。

在模板部分,我们直接使用 {{ title }}{{ description }} 来输出 props 的值。

这样,当我们在父组件中使用这个组件时,就可以通过给 titledescription 属性传入不同的值来动态渲染组件的内容了。

<template><div><CustomComponent title="This is a custom title" /><CustomComponent title="Another title" description="This is another description" /></div>
</template><script>
import CustomComponent from './CustomComponent.vue';export default {components: {CustomComponent,},
};
</script>

在父组件中,我们将 CustomComponent 引入,并通过 titledescription 属性传入不同的值。根据传入的值,CustomComponent 会渲染不同的标题和描述。

二、defineEmits

在Vue3中,defineEmits是一个用于定义组件的事件的函数。它允许你明确列出组件可以触发的事件,使得组件的使用者更容易理解和使用。

使用<script setup>语法糖,你可以在组件的顶层中使用defineEmits函数来定义事件。

下面是一个示例代码,展示了如何使用defineEmits<script setup>来定义组件的事件并在组件中触发这些事件:

<template><button @click="onButtonClick">Click me!</button>
</template><script setup>
import { defineEmits } from 'vue';// 定义组件的事件
const emits = defineEmits(['buttonClick']);// 触发事件
const onButtonClick = () => {emits('buttonClick', 'Button clicked!');
};
</script>

在上面的示例中,我们通过调用defineEmits函数来定义了一个名为buttonClick的事件。然后,我们在onButtonClick函数中使用emits来触发这个事件,并传递了一个字符串参数作为事件的payload。

通过使用defineEmits函数,我们明确了组件可以触发的事件,使得组件使用者能够更容易地了解和使用这些事件。另外,这也提供了一种类型安全的方式来检查事件触发的参数类型。

三、defineExpose

在 Vue 3 中,defineExpose 函数用于在组合式 API组件中向父组件暴露方法或属性。它的作用是将一些内部方法或属性暴露给组件外部,使得父组件可以直接访问到。

使用 defineExpose 的场景是,当我们在组合式 API 组件内部定义了一些需要在父组件中使用的方法或属性时,可以通过 defineExpose 将它们暴露出去。

以下是一个使用 defineExpose 的示例代码:

<template><div><button @click="increaseCounter">Increase Counter</button><p>Counter: {{ counter }}</p></div>
</template><script setup>
import { ref, defineExpose } from 'vue';const counter = ref(0);const increaseCounter = () => {counter.value += 1;
};defineExpose({counter, // 将 counter 暴露给父组件increaseCounter, // 将 increaseCounter 方法暴露给父组件
});
</script>

在上面的代码中,我们定义了一个名为 counter 的响应式变量,并通过 increaseCounter 方法将其递增。然后,通过 defineExpose 函数将 counter 变量和 increaseCounter 方法暴露给父组件。

在父组件中,我们可以通过使用组合式 API 组件的 <script setup> 中的 <script> 块的 expose 属性来访问这些暴露出的属性和方法:

<template><div><ChildComponent ref="childRef" /><button @click="increaseChildCounter">Increase Child Counter</button><p>Child Counter: {{ childCounter }}</p></div>
</template><script setup>
import { ref, onMounted } from 'vue';
import ChildComponent from './ChildComponent.vue';const childRef = ref(null);
let childCounter = null;onMounted(() => {childCounter = childRef.value.counter; // 访问子组件暴露的 counter 变量
});const increaseChildCounter = () => {childRef.value.increaseCounter(); // 调用子组件暴露的 increaseCounter 方法
};
</script>

在父组件中,我们通过 <ChildComponent ref="childRef" /> 的方式引入子组件,并使用 ref 引用子组件实例。然后我们可以通过 childRef.value.counter 访问到子组件暴露的 counter 变量,并通过 childRef.value.increaseCounter() 调用子组件暴露的 increaseCounter 方法。

四、defineOptions( Vue3.3 新特性)

defineOptions 这个宏可以用来直接在 script setup 中声明组件选项,而不必使用单独的 script 块。用来定义 Options API 的选项。

以下是一个使用 defineOptions 的示例代码:
创建父级ParentLevel.vue文件

<template><div></div>
</template><script setup>
import SubLevel from './SubLevel.vue'
console.log('SubLevel', SubLevel);
</script>

创建子级SubLevel.vue文件

<template><div>子级</div>
</template><script setup>
defineOptions({name: 'subLevel',test: '测试'
})
</script>

在上面的代码中,我们创建了一个父级ParentLevel.vue文件,并在文件中引入了SubLevel .vue,并使用console.log 打印出SubLevel 的信息。在子级SubLevel.vue文件,使用了defineOptions宏 内容为 { name: ‘subLevel’, test: ‘测试’}。
在这里插入图片描述
而在vue3.3之前 是无法暴露出自定义的数据的

五、defineSlots(Vue3.3 新特性)

Vue 3.3 新增了 defineSlots 宏。我们可以使用 defineSlots 自己定义插槽的类型。这个宏在简单的组件中几乎用不到,但对于一些复杂的组件非常有用,尤其是这个特性与泛型组件一起使用。或是在 Volar 无法正确地推测出类型时,我们可以手动指定。

<script setup lang="ts">
const slots = defineSlots<{// default 是插槽名称// 函数的第一个TS对象类型参数是插槽期望接收的 props 的TS类型// 返回值类型目前被忽略,可以是 any,未来可能利用它来检查插槽内容default(props: { test: number}): any
}>()
</script>

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

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

相关文章

计算机毕业设计——SpringBoot 个人博客管理系统(附源码)

1&#xff0c;绪论 1.1 背景调研 在互联网飞速发展的今天&#xff0c;互联网已经成为人们快速获取、发布和传递信息的重要渠道&#xff0c;它在人们政治、经济、生活等各个方面发挥着重要的作用。互联网上发布信息主要是通过网站来实现的&#xff0c;获取信息也是要在互联网中…

数模学习day11-系统聚类法

本文参考辽宁石油化工大学于晶贤教授的演示文档聚类分析之系统聚类法及其SPSS实现。 目录 1.样品与样品间的距离 2.指标和指标间的“距离” 相关系数 夹角余弦 3.类与类间的距离 &#xff08;1&#xff09;类间距离 &#xff08;2&#xff09;类间距离定义方式 1.最短…

软件测试|快速、可靠的JavaScript依赖管理工具——yarn

简介 Yarn是一个由Facebook于2016年推出的JavaScript软件包管理器。它的目标是解决npm&#xff08;Node.js的默认软件包管理器&#xff09;在性能和可靠性方面的一些问题。Yarn旨在提供更快、更安全、更稳定的依赖项安装过程&#xff0c;使JavaScript开发人员能够更轻松地管理…

【STM32】HAL库的RCC复位状态判断及软件复位

【STM32】HAL库的RCC复位状态判断及软件复位 在实际开发中 有时候会遇到复位状态不同 导致结果不同的情况 比如在上电复位时 电压不稳定 可能导致一些外部芯片无法正常工作 从而导致进行了错误的操作流程 所以 可以在程序运行后 加一个复位状态判断 用来检测是否正常复位 否则…

Python 编写不同时间格式的函数

该代码是一个时间相关的功能模块&#xff0c;提供了一些获取当前时间的函数。 Report_time() 函数返回当前时间的格式化字符串&#xff0c;例如 "20240110114512"。Y_M_D_h_m_s_time() 函数返回当前时间的年、月、日、时、分、秒的元组格式。Y_M_D_h_m_s() 函数返回…

搬运5款知名度不高,但十分好用的软件

​ 其实有许多工具&#xff0c;知名度不高&#xff0c;用的人也很少&#xff0c;不过并不代表它们不好用&#xff0c;小编励志做一个合格的搬运工&#xff0c;让大家都能用上好用的软件。 1.文本比较——Diffchecker ​ Diffchecker是一款在线文本比较工具&#xff0c;可以找…

【Vue3】2-4 : 声明式渲染及响应式数据实现原理

本书目录&#xff1a;点击进入 一、声明式渲染 1.1 什么是JS表达式&#xff1a;能够进行赋值的操作 ▶ 正确 ▶ 错误示例 二、示例&#xff1a;2秒后&#xff0c;页面中 message 由 hello world 变成 hi vue ▶ 效果 三、原理&#xff1a;利用ES6的Proxy对象对底层进…

zippo打火机激光打标机

激光打标技术是一种高精度的加工方式&#xff0c;能够在各种材料表面进行精细的打标&#xff0c;包括金属、塑料、玻璃等。随着科技的不断进步&#xff0c;激光打标技术的应用范围越来越广泛&#xff0c;特别是在制造行业&#xff0c;已经成为一种重要的加工手段。 Zippo打火机…

设计与实现基于Java+MySQL的模拟银行ATM操作系统

课题背景 随着现代经济的发展&#xff0c;电子支付和自动化银行服务已成为人们生活中不可或缺的一部分。自动取款机&#xff08;ATM&#xff09;作为一种常见的自助服务设备&#xff0c;使用户能够方便地进行资金的存取、查询余额、转账等操作&#xff0c;而无需到银行柜台。 …

如何利用大语言模型(LLM)打造定制化的Embedding模型

一、前言 在探索大语言模型&#xff08;LLM&#xff09;应用的新架构时&#xff0c;知名投资公司 Andreessen Horowitz 提出了一个观点&#xff1a;向量数据库是预处理流程中系统层面上最关键的部分。它能够高效地存储、比较和检索高达数十亿个嵌入&#xff08;也就是向量&…

地图移动逻辑

主要的一些问题 0. 可能会很久没收到,,或者一下子同时受到很多个同步的包 关于坐标滞后导致的一些游戏逻辑问题,比如攻击命中的判定问题等,一般是以服务器数据为判定依据,逻辑判定还是以服务器为主,客户端主要做表现。 1. 插值 关于坐标上报频率,我采取的是每100ms 或…

JS栈和堆:数据是如何存储的

JS栈和堆&#xff1a;数据是如何存储的 背景JavaScript 是什么类型的语言JavaScript 的数据类型内存空间栈空间和堆空间再谈闭包 背景 JS有多种数据类型&#xff1a;数字型&#xff0c;字符串型&#xff0c;数组型等&#xff0c;虽然 JavaScript 并不需要直接去管理内存&#…