Vue 3 组件通信:深入理解 Props 和 Emits 的使用与最佳实践

news/2024/11/22 15:23:42/

Vue 3 中的 propsemits 是组件通信的基础,它们允许组件之间的数据流动和事件触发。以下是 Vue 3 中 propsemits 的详细知识点:

Props

一. 基础用法

在Vue中,props 是父组件传递给子组件的数据。以下是在父组件中定义和传递 props 的步骤:

1. 定义子组件

首先,你需要有一个子组件,它声明了它期望接收的 props

<!-- ChildComponent.vue -->
<template><div>{{ message }}</div>
</template><script>javascript">
export default {props: {message: String}
}
</script>
2. 在父组件中使用子组件

然后,在父组件中,你可以像使用HTML元素一样使用这个子组件,并传递 props

<!-- ParentComponent.vue -->
<template><ChildComponent :message="parentMessage" />
</template><script>javascript">
import ChildComponent from './ChildComponent.vue';export default {components: {ChildComponent},data() {return {parentMessage: 'Hello from parent!'}}
}
</script>
3. 使用 v-bind 传递 props

你可以使用 v-bind 指令(简写为冒号 :)来动态传递数据作为 props

<ChildComponent :propA="valueA" :propB="valueB" />
4. 使用字面量值传递 props

你也可以直接传递字面量值作为 props

<ChildComponent :count="10" />
5. 使用计算属性传递 props

你可以使用计算属性的结果作为 props

<template><ChildComponent :filteredList="computedList" />
</template><script>javascript">
export default {data() {return {items: ['item1', 'item2', 'item3']}},computed: {computedList() {return this.items.filter(item => item.includes('2'));}}
}
</script>
6. 使用方法返回值传递 props

你可以使用方法的返回值作为 props

<template><ChildComponent :user="getUserName" />
</template><script>javascript">
export default {methods: {getUserName() {return 'Kimi';}}
}
</script>
7. 使用插槽插槽传递 props

有时候,你可能会通过插槽的内容传递 props

<template><ChildComponent><template v-slot="{ propA }"><div>{{ propA }}</div></template></ChildComponent>
</template>

在父组件中定义 props 的关键在于理解 props 是单向数据流,即它们只能从父组件流向子组件,而不能反过来。这有助于保持组件之间的数据隔离和组件的可重用性。

二. 类型检查和验证

Vue 3 支持对 props 进行类型检查和验证,确保数据的正确性。

javascript"><script>
export default {props: {// 基础类型检查propA: Number,// 对象类型检查propB: {type: Object,default: () => ({ x: 0, y: 0 })},// 带有验证函数的 proppropC: {type: String,validator: value => {return ['small', 'medium', 'large'].includes(value);}}}
}
</script>
三. 默认值

你可以为 props 提供默认值,以便在没有提供值时使用。

javascript"><script>
export default {props: {propA: {type: String,default: 'default value'}}
}
</script>
四. 非响应式 Props

props 是非响应式的,这意味着如果你更改了 props 的值,Vue 不会更新 DOM。如果你需要响应式数据,应该使用局部数据。

Emits

1. 基础用法

emits 选项用于定义组件可以触发的事件。在子组件中,你可以使用 this.$emit触发这些事件

javascript">// 子组件
<script>
export default {emits: ['update'],methods: {updateValue() {this.$emit('update', 'new value');}}
}
</script>

在父组件中,你可以监听这些事件:

<!-- 父组件 -->
<template><ChildComponent @update="handleUpdate" />
</template><script>javascript">
export default {methods: {handleUpdate(value) {console.log(value); // 'new value'}}
}
</script>
2. 事件修饰符

Vue 3 支持事件修饰符,如 .stop.prevent.once,这些修饰符可以在监听事件时直接使用。

<!-- 父组件 -->
<template><ChildComponent @update.stop="handleUpdate" />
</template>
3. 事件参数

你可以在触发事件时传递参数,这些参数可以在父组件中接收。

javascript">// 子组件
<script>
export default {emits: ['custom-event'],methods: {triggerCustomEvent() {this.$emit('custom-event', { key: 'value' });}}
}
</script>

在父组件中:

<!-- 父组件 -->
<template><ChildComponent @custom-event="handleCustomEvent" />
</template><script>javascript">
export default {methods: {handleCustomEvent(payload) {console.log(payload); // { key: 'value' }}}
}
</script>

<script setup> 中使用 Props 和 Emits

Vue 3 引入了 <script setup> 语法糖,使得 propsemits 的声明更加简洁。

1. defineProps 和 defineEmits
javascript"><script setup>
import { defineProps, defineEmits } from 'vue';// 声明 props
const props = defineProps({propA: String,propB: Number
});// 声明 emits
const emit = defineEmits(['update', 'custom-event']);// 触发事件
function updateValue() {emit('update', 'new value');
}
</script>
2. withDefaults
javascript"><script setup>
import { withDefaults } from 'vue';// 声明并设置默认值
const props = withDefaults(defineProps<{propA?: string;propB?: number;
}>(), {propA: 'default string',propB: 100
});
</script>
3. 类型定义
<script setup lang="ts">
import { defineProps, defineEmits } from 'vue';// 使用 TypeScript 定义 props 和 emits 类型
const props = defineProps<{propA: string;propB?: number;
}>();const emit = defineEmits<{(e: 'update', value: string): void;(e: 'custom-event', payload: { key: string }): void;
}>();
</script>

通过这些知识点,你可以在 Vue 3 中灵活地使用 propsemits 来构建组件化的应用。


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

相关文章

测试使用vite搭建的uni-app打包app区分开发环境和生产环境

用脚手架搭建的uniapp项目&#xff0c;打包H5和小程序可以和web端一样&#xff0c;能够通过env.dev和env.prod区分开发环境和生产环境&#xff0c;但是不知道打包成app时如何区分开发环境和生产环境&#xff0c;在此做一个测试记录。 打开package.json文件&#xff0c;在scrip…

WPF应用程序的生命周期-笔记

应用程序的生命周期 窗体的生命周期: window是一个控件 window中的事件:从window创建到关闭我们称之为窗体的生命周期 每一个窗体的生命周期都是独立的,窗体与窗体之间的生命周期都是独立的 最早加载的事件 控件的事件触发 基本所有的控件都继承与Framework 在WPF中基本所有的…

泷羽sec----shell编程(7)

声明&#xff01; 学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团队无关&#…

逆向攻防世界CTF系列40-ReverseMe-120

逆向攻防世界CTF系列40-ReverseMe-120 直接定位到关键函数 int __cdecl main(int argc, const char **argv, const char **envp) {unsigned int v3; // edxunsigned int v4; // ecx__m128i si128; // xmm1unsigned int v6; // esiconst __m128i *v7; // eax__m128i v8; // xm…

Java在移动端小程序开发中的性能优化研究

Java在移动端小程序开发中的性能优化研究 第一章 绪论 1.1 研究背景及意义 随着移动互联网的快速发展,移动端小程序以其即点即用的便捷性和轻量级特性,迅速成为用户获取服务的首选方式。在此背景下,研究Java在移动端小程序开发中的性能优化,对于提升用户体验、减少资源消…

Altium Designer学习笔记 11-15 异性元件库创建_原理图绘制

基于Altium Designer 23学习版&#xff0c;四层板智能小车PCB 更多AD学习笔记&#xff1a;Altium Designer学习笔记 1-5 工程创建_元件库创建Altium Designer学习笔记 6-10 异性元件库创建_原理图绘制 11、Value值的核对 原理图中还有器件的位号没有编好&#xff0c;实现位号的…

51单片机之串口通讯

1.串口简介 串口&#xff0c;全称串行通信接口或串行通讯接口&#xff08;通常指COM接口&#xff09;&#xff0c;是一种常用于电子设备间通讯的全双工扩展接口。 串口通讯的技术基础&#xff0c;指一位一位地按顺序传送数据。其特点是线路简单&#xff0c;只需一对传输线&…

【Python】【持续项目】Python-安全项目搜集

1、前言 Python发展以来&#xff0c;除了web安全方向&#xff0c;二进制方向也早已经积累有很多用Python写的项目。作为搜集者当然不能错过&#xff01; 2、项目分类 安全编程 多功能Python键盘记录工具&#xff1a;Radium   项目地址&#xff1a;GitHub - mehulj94/Radium:…