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

Vue3的definePros和defineEmits

在 Vue 3 中,definePropsdefineEmits 是组合式 API 中用于定义组件的 props事件 的方法,提供了一种更简洁和明确的方式来管理组件的输入和输出。它们属于 Composition API 的一部分,在 Vue 2 中通常使用 props$emit 来实现。

1. defineProps

defineProps 用来定义组件的 props,即组件从父组件接收的属性。它使得在 <script setup> 中使用 props 变得更加简单和类型安全。

基本用法:
<script setup>
import { defineProps } from 'vue';// 定义 props
const props = defineProps({msg: {type: String,required: true},count: {type: Number,default: 0}
});
</script><template><div><p>{{ props.msg }}</p><p>{{ props.count }}</p></div>
</template>
解释:
  • defineProps 接收一个对象,可以为每个 prop 提供类型、默认值、是否必填等信息。
  • 在 <template> 中直接访问 props,无需手动定义 props
类型推导:

如果使用 TypeScript,可以通过类型推导让 props 更加明确和安全:

<script setup lang="ts">
import { defineProps } from 'vue';interface Props {msg: string;count: number;
}const props = defineProps<Props>();
</script>

2. defineEmits

defineEmits 用于定义组件触发的 自定义事件。它让你在 <script setup> 中声明组件发出的事件,并确保事件名称的类型安全。

基本用法:
<script setup>
import { defineEmits } from 'vue';// 定义事件
const emit = defineEmits<{(event: 'update', newValue: string): void;
}>();// 触发事件
const changeValue = () => {emit('update', 'new value');
};
</script><template><button @click="changeValue">Change Value</button>
</template>
解释:
  • defineEmits 接受一个对象或类型,它定义了所有可能触发的事件及其参数类型。
  • emit 是一个函数,用于触发自定义事件,在 Vue 3 中无需手动绑定 $emit
多事件支持:

你也可以定义多个事件:

<script setup>
const emit = defineEmits<{(event: 'update', newValue: string): void;(event: 'delete', id: number): void;
}>();
</script>

3. 组合使用

你可以在一个组件中同时使用 definePropsdefineEmits,以便管理组件的输入和输出。

<script setup>
import { defineProps, defineEmits } from 'vue';// 定义 props
const props = defineProps({title: String
});// 定义事件
const emit = defineEmits<{(event: 'updateTitle', newTitle: string): void;
}>();// 触发事件
const updateTitle = () => {emit('updateTitle', 'New Title');
};
</script><template><h1>{{ props.title }}</h1><button @click="updateTitle">Update Title</button>
</template>

总结:

  • defineProps:用于定义组件的输入(即 props),提供了类型推导和默认值的支持。
  • defineEmits:用于定义组件的输出(即触发的事件),提供了事件类型安全。

这两个方法大大简化了组件的编写,使得代码更加简洁、可维护,并且提供了更强的类型安全。如果你用 TypeScript,它们能帮助你避免很多常见的错误。

http://www.lryc.cn/news/593225.html

相关文章:

  • Promise入门
  • Node.js:Stream、模块系统
  • 鸿蒙与web混合开发双向通信
  • Linux:多线程---深入生产消费模型环形队列生产消费模型
  • Nestjs框架: RxJS 核心方法实践与错误处理详解
  • 告别项目混乱:基于 pnpm + Turborepo 的现代化 Monorepo 工程化最佳实践
  • win10连接鼠标自动关闭触摸板/win10关闭触摸板(笔记本)
  • 深度学习图像分类数据集—六十种植物病害分类
  • ABP VNext + Temporal:分布式工作流与 Saga
  • install_arm_docker.sh
  • Django接口自动化平台实现(三)
  • Django母婴商城项目实践(八)- 数据渲染与显示之首页
  • LLM 的Top-P参数 是在LLM中的每一层发挥作用,还是最后一层?
  • 【设计模式C#】外观模式(用于解决客户端对系统的许多类进行频繁沟通)
  • Django母婴商城项目实践(七)- 首页数据业务视图
  • 洛谷 P2947:[USACO09MAR] Look Up S ← 数组模拟+单调栈
  • 使用 Gunicorn 部署 Django 项目
  • 5 基于STM32单片机的绝缘检测系统设计(STM32代码编写+手机APP设计+PCB设计+Proteus仿真)
  • 6 STM32单片机的智能家居安防系统设计(STM32代码+手机APP设计+PCB设计+Proteus仿真)
  • 对话访谈 | 盘古信息×锐明科技:中国企业高质量出海“走进去”和“走上去”
  • 家庭KTV v1.1.9 | 曲库丰富,无限制免费K歌
  • 驾驭 Spring Boot 事件机制:8 个内置事件 + 自定义扩展实战
  • 《一行注解解决重复提交:Spring Boot 接口幂等实战》
  • 深入理解设计模式:策略模式的艺术与实践
  • 在非Spring Boot的Spring项目中使用Lock4j
  • 用graphviz画一个关系图
  • 云服务器磁盘IO性能优化的测试与配置方法
  • 2025年7月19日,二维矩阵
  • 智能制造——解读39页汽车行业数字化工厂解决方案【附全文阅读】
  • 异世界历险之数据结构世界(二叉树-leetcode)