初识Vue-组件通信(详解props和emit)

2024-05-05 01:04

本文主要是介绍初识Vue-组件通信(详解props和emit),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

一、组件通信介绍

1.概念

2.作用

3.特点

4.应用

二、组件通信语法

1.Props

1.1.在子组件中声明 props

1.2.在父组件中传递数据

2.Emit

2.1.在子组件中触发事件

2.2.在父组件中监听事件

三、应用实例

1. 购物车组件

2. 表单数据处理

 四、总结


一、组件通信介绍

1.概念

在组件化开发中,一个应用程序通常由多个组件组成。这些组件可能位于不同的层级,有不同的作用和责任。组件通信就是让这些组件之间能够相互交流、传递数据、共享状态或触发行为的机制。

2.作用

  1. 传递数据: 父组件可以通过props向子组件传递数据,子组件可以通过emit触发事件向父组件发送消息。
  2. 共享状态: 多个组件之间可以共享同一份状态数据,确保数据的一致性。
  3. 触发行为: 组件之间可以通过事件触发行为,实现交互功能。
  4. 管理全局状态: 使用状态管理工具(如Vuex)进行全局状态的管理和同步。

3.特点

  1. 解耦性: 组件通信可以将各个组件解耦,使它们能够独立开发、测试和维护。
  2. 灵活性: 可以根据具体需求选择不同的通信方式,如props / emit、$emit / $on、Vuex等,从而灵活应对各种场景。
  3. 可重用性: 合理的组件通信设计可以增强组件的可重用性,提高开发效率。
  4. 状态管理: 可以通过组件通信实现状态的管理,让不同组件共享同一份状态数据。

4.应用

  1. 父子组件通信: 通过props和emit实现父子组件之间的通信,传递数据和触发事件。
  2. 兄弟组件通信: 通过共同的父组件或使用事件总线(如Vue的$emit / $on或自定义事件总线)实现兄弟组件之间的通信。
  3. 跨层级通信: 使用事件总线或状态管理工具(如Vuex)实现跨层级组件之间的通信。
  4. 全局状态管理: 使用状态管理工具(如Vuex)管理应用程序的全局状态,确保各个组件之间的状态同步和一致性。

二、组件通信语法

1.Props

Props 是一种机制,用于父组件向子组件传递数据。子组件通过在其标签上声明 props 来接收来自父组件的数据。在父组件中,可以使用子组件标签上的属性来传递数据。

1.1.在子组件中声明 props
<script>
export default {props: ['message']
};
</script>
1.2.在父组件中传递数据
<ChildComponent message="Hello from parent" />

2.Emit

Emit 是一种机制,用于子组件向父组件发送消息或数据。子组件通过调用 emit 方法触发一个事件,并传递需要发送的数据。父组件通过在子组件标签上监听事件来接收数据。

2.1.在子组件中触发事件
<script>
export default {methods: {sendMessage() {this.$emit('notify', 'Hello from child');}}
};
</script>
2.2.在父组件中监听事件
<ChildComponent @notify="handleNotify" />

这样,父组件就可以在 handleNotify 方法中接收来自子组件的消息了。

三、应用实例

1. 购物车组件

父组件:商品列表组件

<template><div><ProductItem v-for="product in products" :key="product.id" :product="product" @remove="removeProduct" /><ShoppingCart :items="cartItems" @checkout="checkout" /></div>
</template><script>
import ProductItem from './ProductItem.vue';
import ShoppingCart from './ShoppingCart.vue';export default {components: {ProductItem,ShoppingCart},data() {return {products: [...], // 商品列表数据cartItems: []   // 购物车中的商品列表};},methods: {removeProduct(productId) {// 从购物车中移除商品this.cartItems = this.cartItems.filter(item => item.id !== productId);},checkout() {// 处理结账逻辑// 可以向后端提交订单数据等}}
};
</script>

子组件:购物车组件

<template><div><div v-for="item in items" :key="item.id"><span>{{ item.name }}</span><button @click="removeItem(item.id)">Remove</button></div><button @click="checkout">Checkout</button></div>
</template><script>
export default {props: ['items'],methods: {removeItem(itemId) {this.$emit('remove', itemId); // 触发从购物车中移除商品的事件},checkout() {this.$emit('checkout'); // 触发结账事件}}
};
</script>

2. 表单数据处理

父组件:表单组件

<template><div><InputField v-model="formData.username" label="Username" /><InputField v-model="formData.password" label="Password" type="password" /><SubmitButton @submit="submitForm" /></div>
</template><script>
import InputField from './InputField.vue';
import SubmitButton from './SubmitButton.vue';export default {components: {InputField,SubmitButton},data() {return {formData: {username: '',password: ''}};},methods: {submitForm() {// 处理表单提交逻辑// 可以将 formData 发送到后端进行验证}}
};
</script>

子组件:InputField 组件

<template><div><label>{{ label }}</label><input v-model="value" :type="type" /></div>
</template><script>
export default {props: ['value', 'label', 'type'],computed: {inputValue: {get() {return this.value;},set(newValue) {this.$emit('input', newValue); // 触发输入事件,更新父组件中的 formData}}}
};
</script>

子组件:SubmitButton 组件

<template><button @click="submit">Submit</button>
</template><script>
export default {methods: {submit() {this.$emit('submit'); // 触发提交事件,通知父组件提交表单}}
};
</script>
  1. Props:

    • Props允许父组件向子组件传递数据。父组件通过Props属性将数据传递给子组件,在子组件中可以直接使用这些数据进行渲染或其他操作。
    • 在示例中,商品列表组件通过Props将商品数据传递给购物车组件,使购物车组件能够显示正确的商品信息。
  2. Emit:

    • Emit允许子组件向父组件发送消息。子组件可以使用$emit方法触发一个事件,并将需要传递给父组件的数据作为参数传递给该事件。
    • 在示例中,购物车组件通过$emit触发了“remove”和“checkout”事件,父组件可以监听这些事件并执行相应的操作,比如从购物车中移除商品或处理结账逻辑。

 四、总结

  1. Props:

    • Props 允许父组件向子组件传递数据。
    • 子组件通过 props 接收父组件传递的数据,并可以在组件内部使用这些数据。
    • 父组件使用 v-bind 指令将数据传递给子组件,并在子组件标签上使用相应的 prop 名称。
  2. Custom Events (自定义事件):

    • Custom Events 允许子组件向父组件发送消息。
    • 子组件使用 $emit 方法触发一个事件,并可以传递数据作为参数。
    • 父组件使用 v-on 指令监听子组件触发的事件,并在事件处理程序中处理数据。
  3. $emit 方法:

    • $emit 方法用于触发一个自定义事件。
    • 它接受两个参数:事件名称和要传递给事件处理程序的数据。
  4. v-model 指令:

    • v-model 指令用于在表单输入元素上创建双向数据绑定。
    • 它实质上是语法糖,结合了对值的绑定和对 input 事件的监听。
  5. $refs:

    • $refs 提供对子组件的直接访问。
    • 它可以用来访问子组件的属性和方法,但不推荐在父组件中过度使用。

这篇关于初识Vue-组件通信(详解props和emit)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/960484

相关文章

C++ move 的作用详解及陷阱最佳实践

《C++move的作用详解及陷阱最佳实践》文章详细介绍了C++中的`std::move`函数的作用,包括为什么需要它、它的本质、典型使用场景、以及一些常见陷阱和最佳实践,感兴趣的朋友跟随小编一起看... 目录C++ move 的作用详解一、一句话总结二、为什么需要 move?C++98/03 的痛点⚡C++

MySQL中between and的基本用法、范围查询示例详解

《MySQL中betweenand的基本用法、范围查询示例详解》BETWEENAND操作符在MySQL中用于选择在两个值之间的数据,包括边界值,它支持数值和日期类型,示例展示了如何使用BETWEEN... 目录一、between and语法二、使用示例2.1、betwphpeen and数值查询2.2、be

python中的flask_sqlalchemy的使用及示例详解

《python中的flask_sqlalchemy的使用及示例详解》文章主要介绍了在使用SQLAlchemy创建模型实例时,通过元类动态创建实例的方式,并说明了如何在实例化时执行__init__方法,... 目录@orm.reconstructorSQLAlchemy的回滚关联其他模型数据库基本操作将数据添

Java中ArrayList与顺序表示例详解

《Java中ArrayList与顺序表示例详解》顺序表是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构,:本文主要介绍Java中ArrayList与... 目录前言一、Java集合框架核心接口与分类ArrayList二、顺序表数据结构中的顺序表三、常用代码手动

JAVA线程的周期及调度机制详解

《JAVA线程的周期及调度机制详解》Java线程的生命周期包括NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING和TERMINATED,线程调度依赖操作系统,采用抢占... 目录Java线程的生命周期线程状态转换示例代码JAVA线程调度机制优先级设置示例注意事项JAVA线程

详解C++ 存储二进制数据容器的几种方法

《详解C++存储二进制数据容器的几种方法》本文主要介绍了详解C++存储二进制数据容器,包括std::vector、std::array、std::string、std::bitset和std::ve... 目录1.std::vector<uint8_t>(最常用)特点:适用场景:示例:2.std::arra

C++构造函数中explicit详解

《C++构造函数中explicit详解》explicit关键字用于修饰单参数构造函数或可以看作单参数的构造函数,阻止编译器进行隐式类型转换或拷贝初始化,本文就来介绍explicit的使用,感兴趣的可以... 目录1. 什么是explicit2. 隐式转换的问题3.explicit的使用示例基本用法多参数构造

Android使用java实现网络连通性检查详解

《Android使用java实现网络连通性检查详解》这篇文章主要为大家详细介绍了Android使用java实现网络连通性检查的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录NetCheck.Java(可直接拷贝)使用示例(Activity/Fragment 内)权限要求

MyBatis中的两种参数传递类型详解(示例代码)

《MyBatis中的两种参数传递类型详解(示例代码)》文章介绍了MyBatis中传递多个参数的两种方式,使用Map和使用@Param注解或封装POJO,Map方式适用于动态、不固定的参数,但可读性和安... 目录✅ android方式一:使用Map<String, Object>✅ 方式二:使用@Param

SpringBoot返回文件让前端下载的几种方式

《SpringBoot返回文件让前端下载的几种方式》文章介绍了开发中文件下载的两种常见解决方案,并详细描述了通过后端进行下载的原理和步骤,包括一次性读取到内存和分块写入响应输出流两种方法,此外,还提供... 目录01 背景02 一次性读取到内存,通过响应输出流输出到前端02 将文件流通过循环写入到响应输出流