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

Vue 3 30天精进之旅:Day 08 - 组件通信

在Vue 3的开发过程中,组件之间的通信是一个至关重要的概念。理解如何在父子组件、兄弟组件以及通过全局事件总线进行通信,将帮助我们构建更为灵活和可维护的应用。在今天的学习中,我们将探讨以下几个方面:

  1. 父子组件之间的通信
  2. 兄弟组件之间的通信
  3. 非父子组件之间的通信
  4. 总结与实践

1. 父子组件之间的通信

在Vue中,父子组件之间的通信主要通过 props 和 自定义事件 实现。

使用 Props 传递数据

父组件可以通过 props 将数据传递给子组件。我们来看一个简单的示例:

vue

<!-- ParentComponent.vue -->
<template>
  <div>
    <ChildComponent :message="parentMessage" />
  </div>
</template>

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

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

vue

<!-- ChildComponent.vue -->
<template>
  <div>
    <p>{
  
  { message }}</p>
  </div>
</template>

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

在这个例子中,ParentComponent 将 parentMessage 作为 message prop 传递给 ChildComponent,子组件通过 props 接收数据并展示。

使用 Custom Events (自定义事件)

子组件可以通过 $emit 方法向父组件发送消息或事件。例如:

vue

<!-- ChildComponent.vue -->
<template>
  <div>
    <button @click="sendMessage">Send Message to Parent</button>
  </div>
</template>

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

vue

<!-- ParentComponent.vue -->
<template>
  <div>
    <ChildComponent @messageFromChild="receiveMessage" />
    <p>{
  
  { receivedMessage }}</p>
  </div>
</template>

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

export default {
  components: {
    ChildComponent,
  },
  data() {
    return {
      receivedMessage: '',
    };
  },
  methods: {
    receiveMessage(msg) {
      this.receivedMessage = msg;
    },
  },
};
</script>

在这个例子中,ChildComponent 通过 sendMessage 方法触发自定义事件 messageFromChild,而 ParentComponent 则在接收到事件后更新了 receivedMessage

2. 兄弟组件之间的通信

兄弟组件之间的通信可以通过父组件作为中介来实现。父组件可以将数据作为 props 传递给两个兄弟组件,或者通过事件监听来传递消息。

例如,假设我们有两个兄弟组件 SiblingA 和 SiblingB,它们需要通信。我们可以在父组件中处理这个逻辑:

vue

<!-- ParentComponent.vue -->
<template>
  <div>
    <SiblingA @sendMessage="updateMessage" />
    <SiblingB :message="sharedMessage" />
  </div>
</template>

<script>
import SiblingA from './SiblingA.vue';
import SiblingB from './SiblingB.vue';

export default {
  components: {
    SiblingA,
    SiblingB,
  },
  data() {
    return {
      sharedMessage: '',
    };
  },
  methods: {
    updateMessage(msg) {
      this.sharedMessage = msg;
    },
  },
};
</script>

SiblingA.vue 触发事件

vue

<!-- SiblingA.vue -->
<template>
  <div>
    <button @click="sendMessage">Send Message to Sibling B</button>
  </div>
</template>

<script>
export default {
  methods: {
    sendMessage() {
      this.$emit('sendMessage', 'Hi from Sibling A');
    },
  },
};
</script>

SiblingB.vue 接收对方的消息

vue

<!-- SiblingB.vue -->
<template>
  <div>
    <p>{
  
  { message }}</p>
  </div>
</template>

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

3. 非父子组件之间的通信

对于不直接关联的组件,我们通常可以使用 中央事件总线 或 状态管理工具(如 Vuex 或 Pinia)来进行通信。

使用中央事件总线

创建一个事件总线,允许不同组件通过它进行通信。

javascript

// eventBus.js
import { reactive } from 'vue';

const eventBus = reactive({});

export default eventBus;

然后在组件中使用它发送和接收事件:

javascript

// AnyComponent.vue
import eventBus from './eventBus';

export default {
  mounted() {
    this.sendMessage();
    eventBus.on('my-event', this.handleEvent);
  },
  methods: {
    sendMessage() {
      eventBus.dispatch('my-event', 'Hello from AnyComponent');
    },
    handleEvent(msg) {
      console.log(msg);
    },
  },
};

4. 总结与实践

在今天的学习中,我们深入理解了组件之间的通信方式,包括父子组件的props自定义事件、兄弟组件的父组件中介方法,以及通过事件总线实现的非父子组件通信。掌握这些通信方式将帮助我们更好地解决实际开发中的问题。

练习

  1. 尝试改进之前的 Todo 应用,增加新功能,使用组件通信来处理不同组件之间的数据流。
  2. 设计一个简单的消息系统,让多个组件可以互相发送消息,体验事件总线的工作原理。

在下一天的学习中,我们将关注 组合式API 的使用,继续深入Vue的世界。让我们保持学习热情,明天见!


http://www.kler.cn/a/524630.html

相关文章:

  • 動態住宅IP提升網站訪問成功率
  • JavaScript - Web APIs(下)
  • 渗透测试之WAF规则触发绕过规则之规则库绕过方式
  • Oracle迁移DM数据库
  • Databend x 沉浸式翻译 | 基于 Databend Cloud 构建高效低成本的业务数据分析体系
  • CTF-web: Python YAML反序列化利用
  • 锁升级过程与优化操作
  • 消息队列篇--通信协议篇--STOMP(STOMP特点、格式及示例,WebSocket上使用STOMP,消息队列上使用STOMP等)
  • 大屏 UI 设计风格的未来趋势
  • FreeRTOS从入门到精通 第十四章(队列集)
  • [NOI1995] 石子合并
  • Antd React Form使用Radio嵌套多个Select和Input的处理
  • 架构技能(六):软件设计(下)
  • 用户创建命令的详细使用与参数说明
  • 深度学习每周学习总结R5(LSTM-实现糖尿病探索与预测-模型优化)
  • Origami Agents:通过AI驱动的研究工具提升B2B销售效率
  • 网络工程师 (8)存储管理
  • docker运行Open-Webui 界面化展示 deepseek-r1大模型
  • 【新春特辑】2025年春节技术展望:蛇年里的科技创新与趋势预测
  • CUDA学习-内存访问
  • 飞鸟小目标检测数据集VOC+YOLO格式1657张2类别
  • 解锁豆瓣高清海报:深度爬虫与requests进阶之路
  • Kubernetes 环境中的自动化运维实战指南
  • 【灵蛇献瑞】| 2024 中国开源年度报告正式发布!
  • leetcode hot 100 搜索二维矩阵II
  • 详解:网站地图对快速收录的重要性