vue2组件之间通信的四种方法总结

在 Vue 2 中,组件之间的通信可以通过多种方式实现。以下是一些常见的通信方式及其示例:

1. 父子组件通信

a. 父组件向子组件传递数据(Props)

父组件可以通过 props 向子组件传递数据。

父组件示例:

<template>
  <div>
    <child-component :message="parentMessage"></child-component>
  </div>
</template>

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

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

子组件示例:

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

<script>
export default {
  props: ['message']
};
</script>
b. 子组件向父组件传递数据(自定义事件)

子组件可以通过 $emit 触发事件,父组件监听该事件。

子组件示例:

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

<script>
export default {
  methods: {
    sendMessage() {
      this.$emit('message-sent', 'Hello from child!');
    }
  }
};
</script>

父组件示例:

<template>
  <div>
    <child-component @message-sent="handleMessage"></child-component>
  </div>
</template>

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

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

2. 兄弟组件通信

a. 使用父组件作为中介

兄弟组件可以通过父组件进行通信。一个兄弟组件触发事件,父组件接收并再将数据传递给另一个兄弟组件。

父组件示例:

<template>
  <div>
    <sibling-one @send-message="receiveMessage"></sibling-one>
    <sibling-two :message="message"></sibling-two>
  </div>
</template>

<script>
import SiblingOne from './SiblingOne.vue';
import SiblingTwo from './SiblingTwo.vue';

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

兄弟组件示例:

<!-- SiblingOne.vue -->
<template>
  <button @click="sendMessage">Send Message to Sibling Two</button>
</template>

<script>
export default {
  methods: {
    sendMessage() {
      this.$emit('send-message', 'Hello from Sibling One!');
    }
  }
};
</script>
<!-- SiblingTwo.vue -->
<template>
  <div>{{ message }}</div>
</template>

<script>
export default {
  props: ['message']
};
</script>

3. 使用 Event Bus

Event Bus 是一个空的 Vue 实例,可以用来在不相关的组件之间进行通信。

创建 Event Bus:

// eventBus.js
import Vue from 'vue';
export const EventBus = new Vue();

组件 A 发送消息:

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

<script>
import { EventBus } from './eventBus';

export default {
  methods: {
    sendMessage() {
      EventBus.$emit('message-sent', 'Hello from Component A!');
    }
  }
};
</script>

组件 B 接收消息:

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

<script>
import { EventBus } from './eventBus';

export default {
  data() {
    return {
      message: ''
    };
  },
  created() {
    EventBus.$on('message-sent', (msg) => {
      this.message = msg;
    });
  },
  beforeDestroy() {
    EventBus.$off('message-sent'); // 清理事件监听
  }
};
</script>

4. Vuex 状态管理

对于较复杂的应用,可以使用 Vuex 来管理状态,组件通过 Vuex 的状态进行通信。

安装 Vuex:

npm install vuex

创建 Vuex Store:

// store.js
import Vue from 'vue';
import Vuex from 'vuex';

Vue.use(Vuex);

export const store = new Vuex.Store({
  state: {
    message: ''
  },
  mutations: {
    setMessage(state, msg) {
      state.message = msg;
    }
  }
});

在组件中使用 Vuex:

<template>
  <div>
    <button @click="sendMessage">Send Message</button>
    <div>{{ message }}</div>
  </div>
</template>

<script>
import { mapState, mapMutations } from 'vuex';

export default {
  computed: {
    ...mapState(['message'])
  },
  methods: {
    ...mapMutations(['setMessage']),
    sendMessage() {
      this.setMessage('Hello from Vuex!');
    }
  }
};
</script>

总结

在 Vue 2 中,组件之间的通信方式多种多样,具体选择哪种方式取决于应用的需求和组件之间的关系。对于简单的父子组件通信,可以使用 props 和 $emit。对于兄弟组件,可以通过父组件或使用 Event Bus。对于大型应用,使用 Vuex 是一种更为高效的状态管理方式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/938332.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

《外国服务区加油站模型:功能与美观的完美结合 caotu66.com》

这个外国服务区加油站模型在设计上独具特色&#xff0c;兼具实用性和美观性。 从整体布局来看&#xff0c;加油站位于服务区的显眼位置。加油站的顶棚采用了现代风格的设计&#xff0c;顶棚的颜色主要是黄色和蓝色&#xff0c;色彩鲜明且具有辨识度。顶棚下方有多个加油柱&…

mybatis-plus超详细讲解

mybatis-plus &#xff08;简化代码神器&#xff09; 地址&#xff1a;https://mp.baomidou.com/ 目录 mybatis-plus 简介 特性 支持数据库 参与贡献 快速指南 1、创建数据库 mybatis_plus 2、导入相关的依赖 3、创建对应的文件夹 4、编写配置文件 5、编写代码 …

数据结构(顺序表)JAVA方法的介绍

前言 在 Java 中&#xff0c;集合类&#xff08;Collections&#xff09;是构建高效程序的核心组件之一&#xff0c;而 List 接口作为集合框架中的重要一员&#xff0c;是一个有序、可重复的元素集合。与 Set 接口不同&#xff0c;List 保证了元素的顺序性&#xff0c;并允许存…

泊松编辑 possion editing图像合成笔记

开源地址&#xff1a; GitHub - kono-dada/Reproduction-of-possion-image-editing 掩码必须是矩形框

【Flink-scala】DataStream编程模型之状态编程

DataStream编程模型之状态编程 参考&#xff1a; 1.【Flink-Scala】DataStream编程模型之数据源、数据转换、数据输出 2.【Flink-scala】DataStream编程模型之 窗口的划分-时间概念-窗口计算程序 3.【Flink-scala】DataStream编程模型之窗口计算-触发器-驱逐器 4.【Flink-scal…

Linux实操篇-远程登录/Vim/开机重启

目录 传送门前言一、远程登录1、概念2、ifconfig3、实战3.1、SSH&#xff08;Secure Shell&#xff09;3.2、VNC&#xff08;Virtual Network Computing&#xff09;3.3、RDP&#xff08;Remote Desktop Protocol&#xff09;3.4、Telnet&#xff08;不推荐&#xff09;3.5、FT…

【计算机网络】期末考试预习复习|上

作业讲解 物理层作业 共有4个用户进行CDMA通信。这4个用户的码片序列为&#xff1a; A: (–1 –1 –1 1 1 –1 1 1)&#xff1b;B: (–1 –1 1 –1 1 1 1 –1) C: (–1 1 –1 1 1 1 –1 –1)&#xff1b;D: (–1 1 –1 –1 –1 –1 1 –1) 现收到码片序列&#xff1a;(–1 1 –…

CTFHub-ssrf

技能树--Web--SSRF 内网访问 开启题目 尝试访问位于127.0.0.1的flag.php吧 进入环境 根据提示输入即可 127.0.0.1/flag.php 伪协议读取文件 开启题目 尝试去读取一下Web目录下的flag.php吧 进入环境&#xff0c;根据提示输入 file:///var/www/html/flag.php 鼠标右键查看…

解决PyTorch模型推理时显存占用问题的策略与优化

在将深度学习模型部署到生产环境时&#xff0c;显存占用逐渐增大是一个常见问题。这不仅可能导致性能下降&#xff0c;还可能引发内存溢出错误&#xff0c;从而影响服务的稳定性和可用性。本文旨在探讨这一问题的成因&#xff0c;并提供一系列解决方案和优化策略&#xff0c;以…

Java从入门到工作3 - 框架/工具

3.1、SpringBoot框架结构 在 Spring Boot 或微服务架构中&#xff0c;每个服务的文件目录结构通常遵循一定的约定。以下是一个常见的 Spring Boot 服务目录结构示例&#xff0c;以及各个文件和目录的简要说明&#xff1a; my-service │ ├── src │ ├── main │ │…

电子应用设计方案-56:智能书柜系统方案设计

智能书柜系统方案设计 一、引言 随着数字化时代的发展和人们对知识获取的需求增加&#xff0c;智能书柜作为一种创新的图书管理和存储解决方案&#xff0c;能够提供更高效、便捷和个性化的服务。本方案旨在设计一款功能齐全、智能化程度高的智能书柜系统。 二、系统概述 1. 系…

2024 年贵州技能大赛暨全省第二届数字技术应用职业技能竞赛“信息通信网络运行管理员”赛项--linux安全题

Linux操作系统渗透测试 Nmap -sS -p- ip 扫描 这题有俩种做法&#xff0c;一种用3306端口&#xff0c;另一种用48119端口 用48119端口是最简单的做法 nc 连接这个端口如何修改root密码 ssh连接 这样我们就成功的拿到root权限 1.通过本地PC中渗透测试平台Kali对服务器场景进…

网格剖分算法 铺装填充算法效果

1.原图 图&#xff1a;原图 2.OpenCV提取轮廓 图&#xff1a;提取轮廓线 3.计算凸包和最小外围轮廓 图&#xff1a;计算凸包和最小包围轮廓 4.网格剖分效果 图&#xff1a;网格剖分效果 5.铺装填充效果 图&#xff1a;铺装算法效果 原图--》提取轮廓线--》计算最小外包轮廓--》…

JMeter配置原件-计数器

一、面临的问题&#xff1a; 由于本人的【函数助手对话框】中counter计数器每次加2&#xff0c;且只显示偶数(如下图所示)&#xff0c;因此借助【配置原件-计数器】来实现计数功能。 如果有大佬知道解决方式&#xff0c;麻烦评论区解答一下&#xff0c;谢谢。 二、配置原件-c…

旋转花键VS传统花键:传动效率的革新

旋转花键与传统花键都是一种传动装置&#xff0c;用于将转动力传递给另一个轴。主要区别在于其结合了花键轴和滚珠丝杆的功能特点&#xff0c;通过滚珠在花键轴和花键套之间的滚动来实现旋转运动和直线运动的传递&#xff0c;以下是几个关键的差异点&#xff1a; 1、结构设计&a…

C++类模板的应用

template <class T> class mylist{ public: // 这是一个链表的节点 struct Link{ T val; Link* next; } 增 &#xff1a;insert(T val) 在链表中创建新节点&#xff0c;节点上保存的数据为 val 删&#xff1a;remove(T val) 移除链表中数据为 val 的节点 改: operator[](…

python学opencv|读取图像(十二)BGR图像转HSV图像

【1】引言 前述已经学习了opencv中图像BGR相关知识&#xff0c;文章链接包括且不限于下述&#xff1a; python学opencv|读取图像&#xff08;六&#xff09;读取图像像素RGB值_opencv读取灰度图-CSDN博客 python学opencv|读取图像&#xff08;七&#xff09;抓取像素数据顺利…

基于 mzt-biz-log 实现接口调用日志记录

&#x1f3af;导读&#xff1a;mzt-biz-log 是一个用于记录操作日志的通用组件&#xff0c;旨在追踪系统中“谁”在“何时”对“何事”执行了“何种操作”。该组件通过简单的注解配置&#xff0c;如 LogRecord&#xff0c;即可实现接口调用的日志记录&#xff0c;支持成功与失败…

如何在繁忙的生活中找到自己的节奏?

目录 一、理解生活节奏的重要性 二、分析当前生活节奏 1. 时间分配 2. 心理状态 3. 身体状况 4. 生活习惯 1. 快慢适中 2. 张弛结合 3. 与目标相符 三、掌握调整生活节奏的策略 1. 设定优先级 2. 合理规划时间 3. 学会拒绝与取舍 4. 保持健康的生活方式 5. 留出…

Docker:目录挂载、数据卷(补充二)

Docker&#xff1a;目录挂载、数据卷 1. 挂载2. 卷映射 1. 挂载 -v /app/nghtml:/usr/share/nginx/html /app/nghtml 是外部主机的地址 /usr/share/nginx/html 是内部容器的地址这里启动一个nginx&#xff0c;然后在后台运行时其命令为 (base) ➜ ~ docker run -d -p 80:80 …