vue组件之间是怎么传值的?

在 Vue 中,组件之间的传值(通信)可以通过多种方式实现,具体方式取决于组件之间的关系(父子、兄弟、祖孙等)。以下是常见的几种通信方法:


1. 父组件向子组件传值

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

实现步骤
  1. 父组件中通过属性绑定(v-bind:)向子组件传递数据。
  2. 子组件通过 props 接收父组件传递的数据。
代码示例

父组件:

复制代码

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

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


2. 子组件向父组件传值

子组件通过 $emit 方法触发自定义事件,将数据传递给父组件。

实现步骤
  1. 子组件使用 this.$emit('事件名', 数据) 触发事件。
  2. 父组件监听该事件,并通过回调函数获取数据。
代码示例

父组件:

复制代码

vue

<template> <div> <ChildComponent @sendMessage="handleMessage" /> <p>Message from Child: {``{ childMessage }}</p> </div> </template> <script> import ChildComponent from './ChildComponent.vue'; export default { components: { ChildComponent }, data() { return { childMessage: '' }; }, methods: { handleMessage(msg) { this.childMessage = msg; } } }; </script>

子组件:

复制代码

vue

<template> <div> <button @click="sendToParent">Send to Parent</button> </div> </template> <script> export default { methods: { sendToParent() { this.$emit('sendMessage', 'Hello from Child!'); } } }; </script>


3. 兄弟组件之间传值

兄弟组件之间没有直接的关系,可以通过以下方式实现:

方法 1:使用父组件作为中介
  • 将需要共享的数据提升到父组件,通过父组件向兄弟组件传递数据。
代码示例

父组件:

复制代码

vue

<template> <div> <SiblingOne @sendToSibling="handleSiblingData" /> <SiblingTwo :data="siblingData" /> </div> </template> <script> import SiblingOne from './SiblingOne.vue'; import SiblingTwo from './SiblingTwo.vue'; export default { components: { SiblingOne, SiblingTwo }, data() { return { siblingData: '' }; }, methods: { handleSiblingData(data) { this.siblingData = data; } } }; </script>

兄弟组件之间:

  • SiblingOne 使用 $emit 向父组件传递数据。
  • 父组件再通过 props 将数据传递给 SiblingTwo。

方法 2:使用全局事件总线
  • 创建一个事件总线(Event Bus),用来在组件间通信。
  • Vue 3 推荐使用 Pinia 或 Vuex,而不是事件总线。

Event Bus 示例(Vue 2):

复制代码

javascript

// 创建事件总线 import Vue from 'vue'; export const EventBus = new Vue();

使用 EventBus:

  • 兄弟组件 A 发送数据:
复制代码

javascript

EventBus.$emit('customEvent', 'Hello, Brother!');

  • 兄弟组件 B 接收数据:
复制代码

javascript

EventBus.$on('customEvent', (data) => { console.log(data); // "Hello, Brother!" });


4. 跨层级组件通信(祖孙传值)

方法 1:provideinject
  • provide:在祖组件中提供数据。
  • inject:在任意子孙组件中接收数据。
代码示例

祖组件:

复制代码

vue

<template> <div> <ChildComponent /> </div> </template> <script> export default { provide() { return { sharedData: 'Data from Grandparent' }; } }; </script>

孙组件:

复制代码

vue

<template> <div> <p>{``{ sharedData }}</p> </div> </template> <script> export default { inject: ['sharedData'] }; </script>


方法 2:使用 Vuex 或 Pinia(状态管理)
  • 适合处理复杂场景,多个组件共享状态。

总结

场景 推荐方式
父子组件 props$emit
兄弟组件 父组件中转 / Vuex / Pinia
跨层级组件 provideinject
多组件共享复杂数据 Vuex / Pinia

根据项目需求选择适合的方式即可!

相关推荐
九月十九21 分钟前
AviatorScript用法
java·服务器·前端
Jane - UTS 数据传输系统44 分钟前
VUE+ Element-plus , el-tree 修改默认左侧三角图标,并使没有子级的那一项不展示图标
javascript·vue.js·elementui
_.Switch1 小时前
Python Web开发:使用FastAPI构建视频流媒体平台
开发语言·前端·python·微服务·架构·fastapi·媒体
菜鸟阿康学习编程2 小时前
JavaWeb 学习笔记 XML 和 Json 篇 | 020
xml·java·前端
索然无味io2 小时前
XML外部实体注入--漏洞利用
xml·前端·笔记·学习·web安全·网络安全·php
ThomasChan1233 小时前
Typescript 多个泛型参数详细解读
前端·javascript·vue.js·typescript·vue·reactjs·js
爱学习的狮王3 小时前
ubuntu18.04安装nvm管理本机node和npm
前端·npm·node.js·nvm
东锋1.33 小时前
使用 F12 查看 Network 及数据格式
前端
zhanggongzichu3 小时前
npm常用命令
前端·npm·node.js
anyup_前端梦工厂3 小时前
从浏览器层面看前端性能:了解 Chrome 组件、多进程与多线程
前端·chrome