首页 > 其他分享 >深入理解 Vue 3 组件通信

深入理解 Vue 3 组件通信

时间:2024-07-18 20:34:33浏览次数:16  
标签:Vue default 通信 vue export 组件 message eventBus

在 Vue 3 中,组件通信是一个关键的概念,它允许我们在组件之间传递数据和事件。本文将介绍几种常见的 Vue 3 组件通信方法,包括 propsemitsprovideinject、事件总线以及 Vuex 状态管理。

1. 使用 propsemits 进行父子组件通信

props 传递数据

props 是父组件向子组件传递数据的一种机制。在子组件中,通过定义 props 属性来接收父组件传递的数据。

父组件 (ParentComponent.vue):

<template>
  <ChildComponent :message="parentMessage" />
</template>

<script>
import ChildComponent from './ChildComponent.vue';

export default {
  components: {
    ChildComponent
  },
  data() {
    return {
      parentMessage: 'Hello from Parent Component!'
    };
  }
};
</script>

 

子组件 (ChildComponent.vue):

<template>
  <div>{{ message }}</div>
</template>

<script>
export default {
  props: {
    message: {
      type: String,
      required: true
    }
  }
};
</script>

 

emits 传递事件

子组件可以通过 $emit 方法向父组件发送事件,从而实现从子组件向父组件传递信息。

子组件 (ChildComponent.vue):

<template>
  <button @click="sendMessage">Send Message</button>
</template>

<script>
export default {
  emits: ['messageSent'],
  methods: {
    sendMessage() {
      this.$emit('messageSent', 'Hello from Child Component!');
    }
  }
};
</script>

 

父组件 (ParentComponent.vue):

<template>
  <ChildComponent @messageSent="handleMessage" />
</template>

<script>
import ChildComponent from './ChildComponent.vue';

export default {
  components: {
    ChildComponent
  },
  methods: {
    handleMessage(message) {
      console.log(message);
    }
  }
};
</script>

 

2. 使用 provideinject 进行祖孙组件通信

provideinject 允许祖父组件和孙组件之间进行通信,而不需要通过中间的父组件传递数据。

祖父组件 (GrandparentComponent.vue):

<template>
  <ParentComponent />
</template>

<script>
import ParentComponent from './ParentComponent.vue';

export default {
  components: {
    ParentComponent
  },
  provide() {
    return {
      grandparentMessage: 'Hello from Grandparent Component!'
    };
  }
};
</script>

 

孙组件 (GrandchildComponent.vue):

<template>
  <div>{{ grandparentMessage }}</div>
</template>

<script>
export default {
  inject: ['grandparentMessage']
};
</script>

 

3. 使用事件总线进行兄弟组件通信

事件总线是一种常见的用于兄弟组件通信的方法,通常使用 Vue 实例作为事件总线。

事件总线 (eventBus.js):

import { reactive } from 'vue';

const eventBus = reactive({});
export default eventBus;

 

组件 A (ComponentA.vue):

<template>
  <button @click="sendMessage">Send Message to Component B</button>
</template>

<script>
import eventBus from './eventBus.js';

export default {
  methods: {
    sendMessage() {
      eventBus.message = 'Hello from Component A!';
    }
  }
};
</script>

 

组件 B (ComponentB.vue):

<template>
  <div>{{ message }}</div>
</template>

<script>
import { reactive, toRefs } from 'vue';
import eventBus from './eventBus.js';

export default {
  setup() {
    const state = reactive({
      message: ''
    });

    state.message = eventBus.message;

    return {
      ...toRefs(state)
    };
  }
};
</script>

 

 

 

标签:Vue,default,通信,vue,export,组件,message,eventBus
From: https://www.cnblogs.com/zx618/p/18310362

相关文章

  • 深度解析 Vue 3 响应式数据
    Vue3引入了全新的响应式系统,使得数据管理更为灵活和高效。本文将详细解析Vue3响应式数据的原理和使用方法,包括reactive、ref、computed、watch等核心概念,并展示如何在实际项目中应用它们。1.响应式数据的核心概念Vue3的响应式系统基于Proxy对象,通过代理数据对象来实......
  • 杂谈:Vue 的 Diff 算法
    Vue.js使用虚拟DOM来高效地更新用户界面,其中的Diff算法是关键。Diff算法负责找出新旧虚拟DOM之间的差异,并高效地更新实际DOM。本文将详细解析Vue的Diff算法的工作原理和在实际开发中的应用。1.什么是虚拟DOM虚拟DOM是一个轻量级的JavaScript对象,用于描述DOM......
  • 基于注解方式组件管理
    基于注解方式组件管理之前是通过在xml文件中向ioc容器中配置bean,通过<bean标签的方式,注解的方式是在Java类上使用注解标记某个类,将该类配置到ioc容器。主要分成两步:在类上使用注解让ioc识别那些类加了注解1.注解的ioc配置spring提供了以下几个注解,直接标记在类上,把他......
  • python gradio 的输出展示组件
    HTML:展示HTML内容,适用于富文本或网页布局。JSON:以JSON格式展示数据,便于查看结构化数据。KeyValues:以键值对形式展示数据。Label:展示文本标签,适用于简单的文本输出。Markdown:支持Markdown格式的文本展示。Plot:展示图表,如matplotlib生成的图表。Text:用于显示文本,适合较长的输出。......
  • 微信小程序开发中的第三方组件与插件使用
    微信小程序开发中,可以使用第三方组件和插件来扩展小程序的功能和性能。本文将结合代码案例,详细介绍第三方组件和插件的使用。一、第三方组件的使用引入第三方组件微信小程序开发者工具提供了「插件」功能,可以用来引入第三方组件。首先,在小程序的app.json文件中的"plugins"字......
  • TCP/IP协议,以及对等网络通信原理!
    TCP/IP模型协议分层应用层:HTTP:超文本传输协议(网站访问WEB)(Apache、nginx)(IIS)FTP:文件传输协议(网络文件传输)TFTP:简单文件传输协议(交换机和路由器重装)SMTP:简单邮件传输协议(发信)POP3:邮局协议3代(收信)SNMP:简单网络管理协议(服务器监控)DNS:域名系统(域名与IP解析)传输层:TCP:传......
  • Vue2使用face-api.js实现人脸检测、人脸对比、人流量计数
    1、安装依赖npminstallface-api.js--save我安装的版本2、下载模型文件face-api.js需要一些预先训练好的模型文件来执行人脸检测和识别。需要从GitHub仓库中下载这些文件,并放置在项目的public目录下,或者配置一个正确的路径指向这些文件。可以从face-api.js的GitHub页面......
  • vue+element-ui根据时间查询
    查询头<el-form-itemlabel="检验时间:"prop="date"><el-date-pickerv-model="queryParams.date"type="date"placeholder="请选择"clearable......
  • 重生归来,从 996福报 到 N+1告别职场【如何封装一个支持图片和PDF在线预览的Vue组件】
    如何封装一个支持图片和PDF在线预览的Vue组件在本文中,我将介绍如何设计并实现一个Vue组件,该组件能够在线预览图片和PDF文件。我们将基于element-ui的elImageViewer组件进行改造,并使用vue-pdf插件来实现PDF预览功能。本文将详细介绍从设计思路到落地实现的全过程,完整代码在......
  • uni-app的checkbox组件有些情况下视图层不更新解决方案
    应用场景问题:在使用uniapp的复选框组件checkbox实现列表的全选跟不全选功能时发现,列表的checkbox视图层在某些情况下不生效    解决方法 解决方案1:利用  this.$set改变数据,即 this.$set(item,'checked',false),这个时候视图层跟数据都一起更新了,但是在上面那种......