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

Vue 组件通信

目录

  • Vue 组件通信
    • 背景介绍
    • 组件通信方式
      • 1. Props 和 Emit
      • 2. Provide/Inject
      • 3. Vuex/Pinia 状态管理
      • 4. EventBus(不推荐)
    • 组件通信最佳实践
      • 1. 父子组件通信
      • 2. 跨组件通信
    • 常见问题
      • 1. Props 单向数据流
      • 2. 组件解耦
    • 面试题

Vue 组件通信

背景介绍

组件通信是 Vue 应用开发中的重要概念,不同的组件之间需要共享数据、传递事件。Vue 提供了多种组件通信的方式,每种方式都有其适用场景。

组件通信方式

1. Props 和 Emit

// 父组件
<template><child-component:message="parentMessage"@update="handleUpdate"/>
</template><script>
export default {data() {return {parentMessage: 'Hello'}},methods: {handleUpdate(newValue) {this.parentMessage = newValue}}
}
</script>// 子组件
<template><div><p>{{ message }}</p><button @click="sendToParent">发送到父组件</button></div>
</template><script>
export default {props: {message: String},methods: {sendToParent() {this.$emit('update', 'New Message')}}
}
</script>

2. Provide/Inject

// 父组件
<script>
export default {provide() {return {theme: 'dark',toggleTheme: this.toggleTheme}},methods: {toggleTheme() {this.theme = this.theme === 'dark' ? 'light' : 'dark'}}
}
</script>// 子组件
<script>
export default {inject: ['theme', 'toggleTheme']
}
</script>

3. Vuex/Pinia 状态管理

// store/index.js
import { createStore } from 'vuex'export default createStore({state: {count: 0},mutations: {increment(state) {state.count++}},actions: {increment({ commit }) {commit('increment')}}
})// 组件中使用
<script>
export default {computed: {count() {return this.$store.state.count}},methods: {increment() {this.$store.dispatch('increment')}}
}
</script>

4. EventBus(不推荐)

// eventBus.js
import mitt from 'mitt'
export default mitt()// 组件A
import eventBus from './eventBus'export default {methods: {sendMessage() {eventBus.emit('message', 'Hello')}}
}// 组件B
import eventBus from './eventBus'export default {mounted() {eventBus.on('message', (msg) => {console.log(msg)})},beforeUnmount() {eventBus.off('message')}
}

组件通信最佳实践

1. 父子组件通信

// 推荐使用 props/emit
// 父组件
<template><child-componentv-model="value":config="config"@update="handleUpdate"/>
</template>// 子组件
<script>
export default {props: {modelValue: String,config: Object},emits: ['update:modelValue', 'update'],methods: {updateValue(newValue) {this.$emit('update:modelValue', newValue)}}
}
</script>

2. 跨组件通信

// 推荐使用 Pinia
import { defineStore } from 'pinia'export const useUserStore = defineStore('user', {state: () => ({userInfo: null,}),actions: {async fetchUserInfo() {const data = await api.getUserInfo()this.userInfo = data},},
})

常见问题

1. Props 单向数据流

// 错误示例
export default {props: {message: String},methods: {updateMessage() {this.message = 'New Message' // 错误:直接修改 props}}
}// 正确示例
export default {props: {message: String},methods: {updateMessage() {this.$emit('update:message', 'New Message')}}
}

2. 组件解耦

// 使用组合式函数
function useCounter() {const count = ref(0)const increment = () => count.value++const decrement = () => count.value--return {count,increment,decrement,}
}

面试题

  1. Vue 组件间有哪些通信方式?
// 答案要点:
// 1. props/emit:父子组件通信
// 2. provide/inject:跨层级通信
// 3. Vuex/Pinia:状态管理
// 4. EventBus:事件总线(不推荐)
// 5. $parent/$children:直接访问
// 6. $refs:组件引用
  1. 为什么 Vue 不推荐使用 EventBus?
// 答案要点:
// 1. 难以追踪数据流向
// 2. 可能导致内存泄漏
// 3. 不利于代码维护
// 4. 难以调试
  1. Vue3 中如何实现组件通信?
// 答案要点:
// 1. 使用 defineProps 和 defineEmits
// 2. 使用 provide/inject
// 3. 使用 Pinia 进行状态管理
// 4. 使用组合式函数实现逻辑复用
http://www.xdnf.cn/news/13843.html

相关文章:

  • Jenkins 配置信息导出 的详细说明(中英对照)
  • 如何用AI赋能学习
  • OpenCV CUDA模块图像变形------对图像进行 尺寸缩放(Resize)操作函数resize()
  • Elasticsearch:使用 ES|QL 进行地理空间距离搜索
  • Linux612 chroot_list开放;FTP服务ftp:get put,指定上传路径报错553;ftp查看文件夹权限
  • 28-Oracle 23ai Fast Ingest(Memoptimized Rowstore)高频写入
  • 西电【信息与内容安全】课程期末复习笔记
  • jupyter notebook的相关知识及可能遇到的问题
  • LeetCode 2917.找出数组中的K-or值
  • Shell 脚本:系统管理与任务自动化的利器
  • docker compose安装Prometheus、Grafana
  • ubuntu网络连接失败 + mobaxterm拖拽文件出错等问题解决方法
  • CQL3D编译指南
  • PPIO 上线 Qwen3-Embedding 系列模型
  • C++学习-入门到精通【19】杂项汇总
  • 企业级人员评价系统Web端重构实战:前端架构效能升级
  • 【11408学习记录】考研数学核心突破:矩阵本质、系统信息与向量空间基
  • Linux系统lvm操作演示
  • 傲火集团传媒基地武汉启幕 构建数字娱乐产业生态闭环
  • 图像处理 | 基于matlab的多尺度Retinex(MSR)和自适应直方图均衡化(CLAHE)算法联合的低照度图像增强(附代码)
  • linux安装Redis6.0.8
  • 华为云物联网系统开发(纯云端)外包方案及项目需求说明书
  • PEP 8: E302 expected 2 blank lines, found 0
  • 在服务器上使用 Docker 部署 Node.js 后端服务和前端项目
  • 手写Antd的form组件源码
  • WPF调用Python心率监测脚本解决方案
  • 【iSAQB软件架构】以架构为中心的开发方法
  • 53. 最大的子数组和
  • iteration和每一轮,训练周期,迭代计数器 这些名词是什么关系?
  • 2025年中国人工智能发展研究报告:技术突破、行业变革与全球竞争新格局