组件间通信(组件间传递数据)

组件间通信(组件间传递数据)

在 Vue.js 中,组件间通信是开发者需要经常处理的任务,特别是在构建具有多层次组件的复杂应用时。根据组件之间的关系和数据流的复杂程度,可以采用不同的通信方式。以下是常用的几种组件间通信方式:

1. 父子组件通信

父组件向子组件传递数据
  • Props :父组件可以通过 props 向子组件传递数据。Props 是在子组件中声明的属性。
    • 在父组件中使用子组件并传递数据:

      javascript 复制代码
      <!-- ParentComponent.vue -->
      <template>
        <ChildComponent :message="parentMessage" />
      </template>
      
      <script>
      import ChildComponent from './ChildComponent.vue';
      
      export default {
        components: { ChildComponent },
        data() {
          return {
            parentMessage: 'Hello from Parent'
          };
        }
      };
      </script>
    • 在子组件中声明接收 props:

      javascript 复制代码
      <!-- ChildComponent.vue -->
      <template>
        <div>{{ message }}</div>
      </template>
      
      <script>
      export default {
        props: ['message']
      };
      </script>
子组件向父组件传递数据
  • 事件传递 :子组件通过 $emit 方法发送自定义事件,父组件通过监听这些事件来接收数据。

    • 在子组件中发射事件:

      javascript 复制代码
      <!-- ChildComponent.vue -->
      <template>
        <button @click="sendMessage">Send to Parent</button>
      </template>
      
      <script>
      export default {
        methods: {
          sendMessage() {
            this.$emit('messageEvent', 'Hello from Child');
          }
        }
      };
      </script>
    • 在父组件中监听事件:

      javascript 复制代码
      <!-- ParentComponent.vue -->
      <template>
        <ChildComponent @messageEvent="receiveMessage" />
      </template>
      
      <script>
      import ChildComponent from './ChildComponent.vue';
      
      export default {
        components: { ChildComponent },
        methods: {
          receiveMessage(msg) {
            console.log(msg);
          }
        }
      };
      </script>

2. 兄弟组件通信

  • 通过共同的父组件:通常通过父组件作为中介进行通信。第一个子组件向父组件发射事件,父组件处理后将数据传递给另一个子组件。

3. 非父子组件通信

  • Event Bus(主要在 Vue 2 中使用):创建一个空的 Vue 实例用作事件总线,通过它来发射和监听事件。

    • 设置事件总线:

      javascript 复制代码
      // event-bus.js
      import Vue from 'vue';
      export const EventBus = new Vue();
    • 在组件中使用:

      javascript 复制代码
      <!-- Sending Component -->
      <script>
      import { EventBus } from './event-bus.js';
      export default {
        methods: {
          sendMessage() {
            EventBus.$emit('message-event', 'Hello World');
          }
        }
      };
      </script>
      
      <!-- Receiving Component -->
      <script>
      import { EventBus } from './event-bus.js';
      export default {
        mounted() {
          EventBus.$on('message-event', (msg) => {
            console.log(msg);
          });
        }
      };
      </script>
  • Vuex:用于全局状态管理,提供一种集中式的状态存储,并允许所有组件访问。适用于大型应用或需要共享状态的多个组件。

    • 使用 Vuex 的时候,需要在每个组件中使用 mapState, mapGetters, mapMutations, mapActions 等辅助函数来访问和操作全局状态。

4. Provide/Inject

  • Provide/Inject API :用于祖先组件向所有子孙组件传递数据,而无需逐层传递。
    • 在祖先组件中提供数据:

      javascript 复制代码
      // GrandparentComponent.vue
      <script>
      export default {
        provide() {
          return {
            sharedData: 'This is shared data'
          };
        }
      };
      </script>
    • 在子孙组件中注入数据:

      javascript 复制代码
      // AnywhereDeepComponent.vue
      <template>
        <div>{{ sharedData }}</div>
      </template>
      
      <script>
      export default {
        inject: ['sharedData']
      };
      </script>

每种通信方式都有其适合的场景,根据组件关系和应用复杂度,合理选择可以提高代码的可维护性和可扩展性。

组件间通信(传递数据)

父组件向子组件传递数据

  • 父组件可以通过props向子组件传递数据。在子组件中,使用props选项来接收 父组件定义的数据。
javascript 复制代码
// 父组件
<template>

  <div class="MineralView-container">
  <h1>[MineralView]</h1>

  <MineralsTable :testDeliverText="testDeliverText"></MineralsTable>
  </div>
</template>

data() {

    return{
      testDeliverText: 'test'
    }
javascript 复制代码
// 子组件
// 在子组件中,使用`props`选项来接收 父组件定义的数据
<div>
  组件间通信: <hr>
  this data is from MineralView.vue: {{testDeliverText}}
</div>

props: ['testDeliverText'],

子组件向父组件传递数据 -- 通过event

javascript 复制代码
<button @click="sendMessage">click, 子组件向父组件传递数据</button>

data() {
    return {

      title:'Hello from MineralsTable.vue'
    };
  },
methods: {
      // 子组件向父组件传递数据
      sendMessage() {
        this.$emit('messageEvent', this.title);
      },
javascript 复制代码
<MineralsTable
      :testDeliverText="testDeliverText"
      @messageEvent="receiveMessage">
  </MineralsTable>

<h1>{{testReceiveText}}</h1>


data() {

    return{
      testDeliverText: 'test',
      testReceiveText: 'testReceive'
    }

  },
methods: {
  // @messageEvent="receiveMessage"  父组件监听$emit对应事件(以接收该事件携带的数据)
  // 父组件接收 子组件传递来的数据
  receiveMessage(msg) {
    console.log(msg);
    this.testReceiveText = msg
  }
相关推荐
NetX行者35 分钟前
用 Vite + Vue3 + UnoCSS 搭建企业级项目模板(一):基础骨架
vue·vite·unocss
java水泥工8 小时前
什么是前端
java·vue·html5
mont evergreen1 天前
一封从外部世界寄来的信:二维码数据如何穿越三重门,抵达你的屏幕
electron·vue·事件
志尊宝2 天前
Vue3 零基础每日笔记(071):暗黑模式与主题切换——CSS 变量 + Element Plus 暗黑方案
前端·css·笔记·vue·html·前端开发·软件开发
怦然丶心动2 天前
用 Java 把干支历法算清楚:从节气切年到可读摘要
java·算法·vue·独立开发·spring boot / spring
我最爱吃鱼香茄子4 天前
【毕业设计优选】人力资源管理系统|Java|SpringBoot|Vue|前后端分离|带详细文档+部署教学视频
java·vue·毕业设计·springboot
骑着蜗牛撵大象3275 天前
SpringBoot+Vue3 企业智能体侧挂架构:独立服务、独立数据库与主线零侵入落地
数据库·spring boot·架构·vue·springboot·事件驱动·服务拆分
码艺-Alimjan7 天前
Tauri 网站To桌面应用实战总结
前端·javascript·vue
liangshiwei10 天前
ABP x Vue:介绍 ABP Vue UI
vue·abp
frjc11 天前
前端技术选型:主流方案对比与落地建议
vue·react·angular