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

组件通信的方式

在 Vue 中,组件间的通信方式有很多,主要的通信方式包括以下几种。根据项目的复杂度和需求,可以选择不同的方式。

1. 父子组件通信

这是最常见的通信方式。父子组件之间的通信通常使用 props$emit

父传子:使用 props

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

<!-- 父组件 -->
<template><child-component :message="parentMessage"></child-component>
</template><script>
export default {data() {return {parentMessage: 'Hello from parent'};}
};
</script><!-- 子组件 -->
<template><div>{{ message }}</div>
</template><script>
export default {props: ['message']
};
</script>
子传父:使用 $emit

子组件通过 $emit 向父组件传递数据。

<!-- 父组件 -->
<template><child-component @sendMessage="handleMessage"></child-component>
</template><script>
export default {methods: {handleMessage(msg) {console.log('Message from child:', msg);}}
};
</script><!-- 子组件 -->
<template><button @click="sendMessage">Send message to parent</button>
</template><script>
export default {methods: {sendMessage() {this.$emit('sendMessage', 'Hello from child');}}
};
</script>

2. 兄弟组件通信

兄弟组件间可以通过共同的父组件进行通信,父组件通过 props$emit 中转数据。

示例:
<!-- 父组件 -->
<template><sibling-one @sendMessage="receiveMessage"></sibling-one><sibling-two :message="message"></sibling-two>
</template><script>
export default {data() {return {message: ''};},methods: {receiveMessage(msg) {this.message = msg;}}
};
</script><!-- 兄弟组件 1 -->
<template><button @click="sendMessage">Send message to sibling</button>
</template><script>
export default {methods: {sendMessage() {this.$emit('sendMessage', 'Hello from sibling one');}}
};
</script><!-- 兄弟组件 2 -->
<template><p>{{ message }}</p>
</template><script>
export default {props: ['message']
};
</script>

3. 跨组件通信(使用 Event Bus)

如果组件之间没有父子关系,可以通过全局事件总线(Event Bus)来进行通信。事件总线是一个简单的 Vue 实例,用于在不同组件之间传递事件。

示例:
// EventBus.js
import Vue from 'vue';
export const EventBus = new Vue();
<!-- 发送事件的组件 -->
<template><button @click="sendMessage">Send message to other component</button>
</template><script>
import { EventBus } from './EventBus';export default {methods: {sendMessage() {EventBus.$emit('messageFromChild', 'Hello from child');}}
};
</script>
<!-- 接收事件的组件 -->
<template><p>{{ message }}</p>
</template><script>
import { EventBus } from './EventBus';export default {data() {return {message: ''};},created() {EventBus.$on('messageFromChild', (msg) => {this.message = msg;});},beforeDestroy() {EventBus.$off('messageFromChild');}
};
</script>

4. Vuex(适用于大型应用)

对于较复杂的应用,使用 Vuex 来管理全局状态是一个很好的解决方案。Vuex 是 Vue 的官方状态管理库,它允许组件之间共享状态。

示例:
  1. 创建 Vuex Store
// store.js
import { createStore } from 'vuex';export default createStore({state: {message: ''},mutations: {setMessage(state, msg) {state.message = msg;}},actions: {updateMessage({ commit }, msg) {commit('setMessage', msg);}}
});
  1. 组件中使用 Vuex
<template><div><p>{{ message }}</p><button @click="updateMessage">Update message</button></div>
</template><script>
import { useStore } from 'vuex';export default {setup() {const store = useStore();const message = store.state.message;const updateMessage = () => {store.dispatch('updateMessage', 'Hello from Vuex');};return {message,updateMessage};}
};
</script>

5. Provide/Inject(适用于祖孙组件)

provideinject 用于祖孙组件之间的通信。父组件使用 provide 提供数据,子组件使用 inject 获取数据。

示例:
<!-- 祖先组件 -->
<template><child-component></child-component>
</template><script>
export default {provide() {return {message: 'Hello from ancestor'};}
};
</script><!-- 孙子组件 -->
<template><p>{{ message }}</p>
</template><script>
export default {inject: ['message']
};
</script>

6. Local Storage / Session Storage(持久化数据)

对于一些需要跨页面或跨浏览器标签页的数据传递,可以使用 localStoragesessionStorage 来存储数据。

示例:
// 设置数据
localStorage.setItem('message', 'Hello from localStorage');// 获取数据
const message = localStorage.getItem('message');
console.log(message);  // 输出: Hello from localStorage

7. URL 参数(适用于页面跳转)

当需要在页面之间传递数据时,可以通过 URL 的查询参数(例如 ?key=value)来实现。

示例:
// 页面跳转时携带参数
this.$router.push({ path: '/target', query: { message: 'Hello from URL' } });// 在目标组件中获取参数
const message = this.$route.query.message;

总结:

常用的组件间通信方式包括:

  1. 父子组件通信props$emit
  2. 兄弟组件通信(通过父组件中转)
  3. 跨组件通信(事件总线)
  4. Vuex(全局状态管理)
  5. Provide/Inject(祖孙组件)
  6. Local Storage / Session Storage(持久化数据)
  7. URL 参数(跨页面传递数据)

选择通信方式时,根据应用规模、组件之间的关系和需求来决定最合适的方式。

http://www.lryc.cn/news/615224.html

相关文章:

  • Docker容器部署Tomcat线上商城
  • Leetcode——556. 下一个更大元素 III
  • 八、《DaaS(设备即服务):企业轻资产化新路径》--从97.4%首期投入削减到AI算力高效迭代的范式革命
  • Spring 框架中提供Aware接口,实现感知容器对象
  • spring.config.import 不存在
  • “高大上“的SpringCloud?(微服务体系入门)
  • ELK常见的问题
  • 智能机票助手-接入Ollama本地模型-Spring-AI-Alibaba
  • 在ubuntu服务器下安装cuda和cudnn(笔记)
  • 揭秘MyBatis核心类MappedStatement
  • 多模态RAG赛题实战--Datawhale AI夏令营
  • 如何分析需求的可行性
  • 生产环境某业务服务JVM调优总结
  • 避免在微信小程序中频繁使用setData方法
  • 扩散LLM推理新范式:打破生成长度限制,实现动态自适应调节
  • 机器学习——09 聚类算法
  • BGP 协议笔记
  • 使用qemu运行与GDB调试内核
  • 微软推出革命性AI安全工具Project IRE,重塑网络安全防御新范式
  • 用天气预测理解分类算法-从出门看天气到逻辑回归
  • Kubernetes(K8s)不同行业的典型应用场景及价值分析 原创
  • windows、linux应急响应入侵排查
  • Qdrant Filtering:must / should / must_not 全解析(含 Python 实操)
  • 【2025】Datawhale AI夏令营-多模态RAG-Task1、Task2笔记-任务理解与Baseline代码解读
  • 金融通用智能体(Financial General Agent, FGA)的端到端解决方案
  • 机器翻译中的语言学基础详解(包括包括语法、句法和语义学等)
  • C语言:构造类型
  • TDengine IDMP 产品基本概念
  • 使用 Visual Studio 2022 编译 PortAudio 项目
  • occworld(1):论文解读