vue3学习记录二组件之间的通信方式-下

news/2024/11/25 23:22:49/

三 defineProps和defineEmits

- defineProps 和 defineEmits 都是只能在 <script setup> 中使用的编译器宏。
- 不需要导入
- defineProps 接收与 props 选项相同的值,defineEmits 接收与 emits 选项相同的值。
- defineProps 和 defineEmits 在选项传入后,会提供恰当的类型推导。
- 传入到 defineProps 和 defineEmits 的选项会从 setup 中提升到模块的作用域
const props = defineProps<{foo: stringbar?: number
}>()const emit = defineEmits<{(e: 'change', id: number): void(e: 'update', value: string): void
}>()

示例:

<!-- MyChildComponent.vue -->
<template><div><p>{{ myProp }}</p><button v-on:click="$emit('myEvent', 'Hello from child!')">Emit event</button></div>
</template><script lang="ts">
import { defineComponent, PropType, EmitType } from 'vue';export default defineComponent({name: 'MyChildComponent',props: {myProp: {type: String as PropType<string>,required: true}},emits: {myEvent: {type: String as EmitType<string>}}
});
</script><!-- MyParentComponent.vue -->
<template><div><MyChildComponent v-bind:myProp="parentProp" v-on:myEvent="handleEvent" /></div>
</template><script lang="ts">
import MyChildComponent from './MyChildComponent.vue';export default {components: {MyChildComponent},data() {return {parentProp: 'Hello from parent!'};},methods: {handleEvent(message: string) {console.log(message);}}
};
</script>

在父组件 MyParentComponent 中使用了子组件 MyChildComponent,
并通过 v-bind 和 v-on 指令进行了传值和事件监听。
在子组件中,我们通过 $emit 方法来触发自定义事件
defineProps 原理

Vue 3 使用了一种叫做 “响应式系统” 的技术来追踪和响应数据变化。当数据发生变化时,Vue 会自动更新视图,以保证数据和视图的一致性。
Vue 使用了一个叫做 “响应式代理” 的技术来实现响应式系统。响应式代理是一个对象,它可以监视对象属性的访问和修改,并在数据发生变化时触发 Vue 的响应机制。
Vue 3 使用了一个叫做 “Reflect” 的内置对象来实现响应式代理。Reflect 对象提供了一系列方法来操作对象的属性和方法,例如获取对象的属性值、设置对象的属性值、删除对象的属性等。
Vue 3 中的 defineProps 方法就是使用 Reflect 对象来实现响应式代理的。它的作用是将对象的属性包装成响应式属性,使得在修改属性时能触发响应式系统。

defineProps 的语法如下:

defineProps(target: object, props: object | Array<string>)

其中 target 是要添加或修改属性的对象,props 是一个对象或字符串数组,包含要添加或修改的属性的名称。

defineEmits 原理
1. defineEmits 是 Vue 3 Composition API 提供的一个方法,它允许你在组件中定义和暴露自定义事件发射器。它类似于 Vue 2 Options API 提供的 emit 方法,但有几个关键的不同之处:
2. defineEmits 是响应式的:发射器的值的变化会自动触发组件的更新。
3. defineEmits 是可组合的:你可以将它与其他 Composition API 函数结合起来,以创建更复杂的行为。
4. defineEmits 是类型安全的:它使用 TypeScript 装饰器语法为你的发射器提供类型检查。

要使用 defineEmits,你需要首先从 vue 模块中导入它:
	import { defineEmits } from 'vue';export default defineComponent({emits: ['submit'],methods: {handleSubmit() {this.submit();}}});

在这个例子中,组件定义了一个名为 submit 的发射器,可以通过调用 submit 方法来触发它。
当调用 submit 方法时,它会在组件上触发 submit 事件,父组件或其他任何侦听器都可以侦听这个事件。
思考:setup中的宏编译


http://www.ppmy.cn/news/9453.html

相关文章

什么是密码管理器?它安全吗?

密码管理器或密钥管理员是一类用于生成、检索、保存及管理复杂密码、数字签名的措施&#xff0c;可以由硬件或软件实现。因此&#xff0c;密码管理器一般也称作密码管理软件。复杂密码的生成一般按需要以随机算法产生&#xff0c;而密码数据则保存于一个以密码、数字签名等方式…

代码随想录拓展day7 649. Dota2 参议院;1221. 分割平衡字符串;5.最长回文子串;132. 分割回文串 II;673.最长递增子序列的个数

代码随想录拓展day7 649. Dota2 参议院&#xff1b;1221. 分割平衡字符串&#xff1b;5.最长回文子串&#xff1b;132. 分割回文串 II&#xff1b;673.最长递增子序列的个数 贪心和动态规划的题目。因为贪心其实没什么规律&#xff0c;所以就简要记录了。 649. Dota2 参议院 …

基于Vue和SpringBoot的宾馆管理系统的设计和实现

作者主页&#xff1a;Designer 小郑 作者简介&#xff1a;Java全栈软件工程师一枚&#xff0c;来自浙江宁波&#xff0c;负责开发管理公司OA项目&#xff0c;专注软件前后端开发&#xff08;Vue、SpringBoot和微信小程序&#xff09;、系统定制、远程技术指导。CSDN学院、蓝桥云…

CAS 的使用场景 CAS的ABA问题的优化 以及 synchronized 的三大优化

目录 &#x1f388;专栏链接:多线程相关知识详解 一.什么是CAS 二.CAS最常用的两个场景 Ⅰ.实现原子类 Ⅱ.实现自旋锁 三.CAS的ABA问题 四.优化解决CAS的ABA问题 五.synchronized的优化 Ⅰ.锁升级/锁膨胀 Ⅱ.锁消除 Ⅲ.锁粗化 一.什么是CAS CAS&#xff08;Compar…

ThreadLocal

ThreadLocal是什么ThreadLocal&#xff0c;本地线程变量&#xff0c;ThreadLocal中填充的是当前线程的变量&#xff0c;该变量对其他线程来说是封闭且隔离的。ThreadLocal的静态内部类ThreadLocalMap为每个Thread都维护了一个数组table&#xff0c;ThreadLocal确定了一个数组下…

sum and plan | 要温和有力量地长途旅行~

最近在一堆DDL和一群羊中夹缝求生。坐在回家的车上&#xff0c;那就小写这姗姗来迟的年末summary和年初plan~ 纷纷扰扰的2022在“低气压”的12月里进入尾声。年末”盘库存“&#xff0c;虽然一些目标和任务未能达成&#xff0c;但这也算是充实有成长的一年。“转换”的一年&am…

Word处理控件Aspose.Words功能演示:使用 C# 将 Word 转换为 HTML

Aspose.Words 是一种高级Word文档处理API&#xff0c;用于执行各种文档管理和操作任务。API支持生成&#xff0c;修改&#xff0c;转换&#xff0c;呈现和打印文档&#xff0c;而无需在跨平台应用程序中直接使用Microsoft Word。此外&#xff0c; Aspose API支持流行文件格式处…

【数据结构】C语言实现栈和队列

目录 一、栈 1、栈的概念及结构 2、如何实现栈 3、代码实现 3.1 栈的定义 3.2 栈中将要实现的函数 3.3 函数实现 二、队列 1、队列的概念及结构 2、如何实现队列 3、代码实现 3.1 队列定义 3.2 队列中将要实现的函数 3.3 函数实现 一、栈 1、栈的概念及结构 栈&am…