vue3 ts defineProps、defineEmits、defineExpose、defineOptions、defineSlots

news2024/11/16 23:40:18

请添加图片描述


文章目录

  • 前言
  • 一、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.coloradmin.cn/o/1372209.html

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

相关文章

多机TCP通讯之hello world(C++)

文章目录 TCP是什么准备工作CMakeLists.txt服务端代码客户端代码参考 TCP是什么 TCP&#xff08;传输控制协议&#xff09;是一种在计算机网络中广泛使用的协议&#xff0c;它提供了可靠的、面向连接的数据传输服务。TCP 是 OSI 模型中的传输层协议&#xff0c;它确保了数据的…

RPA财务机器人在厦门市海沧医院财务管理流程优化汇总的应用RPA全球生态 2024-01-05 17:27 发表于河北

目前国内外研究人员对于RPA机器人在财务管理流程优化领域中的应用研究层出不穷&#xff0c;但现有研究成果主要集中在财务业务单一领域&#xff0c;缺乏财务管理整体流程一体化管控的研究。RPA机器人的功能绝非单一的财务业务处理&#xff0c;无论从自身技术发展&#xff0c;或…

php处理高并发下单减库存解决

目录 一&#xff1a; 问题描述 二&#xff1a;可能方案 三&#xff1a;加锁方案 一&#xff1a; 问题描述 处理高并发下的库存减少是电商系统中的一大挑战。当多个用户同时尝试下单购买同一商品时&#xff0c;如何确保库存的准确性&#xff0c;同时保证系统的高可用性&#…

(23)Linux的软硬连接

前言&#xff1a;上一章我们讲解了 inode&#xff0c;为文件系统收了尾&#xff0c;这几章我们充分地讲解完了文件系统的知识点&#xff0c;现在我们开始开始学习软硬链接了。 软硬链接 1、Linux 下的快捷方式&#xff1a;软链接 上一章我们介绍完了 inode &#xff0c;我们…

SpringCloudAlibaba微服务架构实战派上下册技术交流!

另外我的新书RocketMQ消息中间件实战派上下册&#xff0c;在京东已经上架啦&#xff0c;目前都是5折&#xff0c;非常的实惠。 https://item.jd.com/14337086.html​编辑https://item.jd.com/14337086.html “RocketMQ消息中间件实战派上下册”是我既“Spring Cloud Alibaba微…

力扣最热一百题——只出现一次的数字

这个合集已经很久没有更新了&#xff0c;今天来更新更新~~~ 目录 力扣题号 题目 题目描述 示例 提示 题解 Java解法一&#xff1a;Map集合 Java解法二&#xff1a;位运算 C位运算代码 力扣题号 136. 只出现一次的数字 - 力扣&#xff08;LeetCode&#xff09; 下述题…

FS【1】:SSP

文章目录 前言1. Abstract2. Introduction2.1. Motivation2.1.1. Few-shot Segmentation (FSS) Task2.1.2. Few-shot Segmentation (FSS) Problem 2.2. Contribution 3. Methods3.1. Motivation3.2. Overview of the architecture4.3. Self-support Prototype4.4. Adaptive Sel…

golang并发安全-select

前面说了golang的channel&#xff0c; 今天我们看看golang select 是怎么实现的。 数据结构 type scase struct {c *hchan // chanelem unsafe.Pointer // 数据 } select 非默认的case 中都是处理channel 的 接受和发送&#xff0c;所有scase 结构体中c是用来存储…

UCF101 数据集介绍与下载

一、介绍 UCF101 是一个现实动作视频的动作识别数据集&#xff0c;收集自YouTube&#xff0c;提供了来自101个动作类别的13320个视频。官方&#xff1a;https://www.crcv.ucf.edu/research/data-sets/ucf101/ 数据集名称&#xff1a;UCF-101&#xff08;2012&#xff09; 总视…

mapboxGL中区域掩膜的实现

概述 区域掩膜的功能也是比较常见的功能呢&#xff0c;本文分享在mapboxGL中结合canvas如何实现。 效果 实现 1. 创建画布 先创建一个map大小的canvas&#xff0c;设置其大小与样式&#xff0c;并添加到地图画布容器中。 const {width, height} map.getCanvas() canvas …

Vue入门三(表单控制|购物车案例|v-model进阶|与后端交互|计算属性|监听属性|Vue生命周期)

文章目录 一、表单控制二、购物车案例三、v-model进阶四、与后端交互跨域问题解决&#xff0c;三种交互方法跨域问题详解1-CORS&#xff1a;后端代码控制&#xff0c;上面案例采用的方式1) 方式一&#xff1a;后端添加请求头2) 方式二&#xff1a;编写中间件3) 方式三&#xff…

什么是线程?

线程 1. 线程概述 线程是计算机科学中的基本概念&#xff0c;指的是在一个进程中执行的独立指令流。通常&#xff0c;一个进程可以包含多个线程&#xff0c;它们共享进程的资源&#xff0c;如内存空间、文件句柄等&#xff0c;但每个线程有自己的独立执行流。线程是操作系统进…

Python图片格式转换与文字识别:技术与实践

目录 一、引言 二、Python图片格式转换 PIL库介绍 代码示例 质量优化 三、文字识别技术 四、Python实现文字识别 1、安装与配置OCR工具 2. 读取图片并提取文字 3. 优化与提高识别准确率 五、实践与应用案例 六、结论 一、引言 随着数字化时代的到来&#xff0c;图…

SOLIDWORKS 2024新功能之SOLIDWORKS PDM篇

SOLIDWORKS 2024 新功能 PDM篇目录概述 • 装配体直观 • 在 Web2 中下载文件的特定版本 • 文件类型图标 • “更改状态”命令中的签出选项 • 复制树对话框 • 查看检出事件详细信息 • 系统变量 • 查看许可证使用 • 数据安全增强功能 • SOLIDWORKS PDM 性能改进…

软件架构之事件驱动架构

一、定义 事件驱动的架构是围绕事件的发布、捕获、处理和存储&#xff08;或持久化&#xff09;而构建的集成模型。 某个应用或服务执行一项操作或经历另一个应用或服务可能想知道的更改时&#xff0c;就会发布一个事件&#xff08;也就是对该操作或更改的记录&#xff09;&am…

msckf_vio在ubuntu20.04中的编译

1.新建catkin workspace文件夹&#xff0c;并在其中新建src文件夹&#xff0c;并将源码clone至src内。 源码地址&#xff1a;https://github.com/KumarRobotics/msckf_vio 目录层级示意如下&#xff0c;build和devel不必新建&#xff0c;后续指令会自动新建。 2. 在编译之前…

虹科技术丨PCAN网关设备:打通通信壁垒,LED指示灯编程示例

来源&#xff1a;虹科汽车智能互联 虹科技术丨PCAN网关设备&#xff1a;打通通信壁垒&#xff0c;LED指示灯编程示例 原文链接&#xff1a;https://mp.weixin.qq.com/s/hpxssnDeD-43x3tyHJbAtA 欢迎关注虹科&#xff0c;为您提供最新资讯&#xff01; 导读 在工业自动化、汽…

python 文本内容随机生成器

这段代码是一个用于生成指定长度的随机文本的函数。主要包括两个函数&#xff1a;generate_text()和generate_other_content()。 generate_text(original_text, length)函数接受两个参数&#xff1a;原始文本和生成文本的长度。该函数的作用是根据原始文本生成指定长度的文本。…

竞赛保研 基于深度学习的人脸识别系统

前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于深度学习的人脸识别系统 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f9ff; 更多资料, 项目分享&#xff1a; https://gitee.com/dancheng-senior/…

【SpringCloud】之网关应用(进阶使用)

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是君易--鑨&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的博客专栏《SpringCloud开发之网关应用》。&#x1f3af;&a…