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

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

在 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
  }
相关推荐
huangyiyi666662 小时前
轮询那些事儿
javascript·前端框架·vue·js
七仔的博客3 小时前
博客的加载速度和大小的优化、优化再优化
vue·博客·优化·gzip·live2d
duandashuaige20 小时前
解决用electron打包Vue工程(Vite)报错electron : Failed to load URL : xxx... with error : ERR _CONNECTION_REFUSED
javascript·typescript·electron·npm·vue·html
java水泥工1 天前
旅游管理系统|基于SpringBoot和Vue的旅游管理系统(源码+数据库+文档)
spring boot·vue·计算机毕业设计·java毕业设计·旅游管理系统
duansamve2 天前
Vue3与Vue2中使用对比
vue
Jeffrey__Lin3 天前
解决ElementPlus使用ElMessageBox.confirm,出现层级低于el-table的问题
前端·javascript·elementui·vue·elementplus
麦麦大数据4 天前
F024 RNN+Vue+Flask电影推荐可视化系统 python flask mysql 深度学习 echarts
python·rnn·深度学习·vue·echarts·电影推荐
HECHEN****5 天前
Composition API 与 React Hook 很像,区别是什么?
vue·面试题
知识分享小能手5 天前
微信小程序入门学习教程,从入门到精通,项目实战:美妆商城小程序 —— 知识点详解与案例代码 (18)
前端·学习·react.js·微信小程序·小程序·vue·前端技术
cgsthtm5 天前
RuoYi.Net后端返回雪花ID前端精度丢失问题
oracle·vue·精度丢失·雪花id·ruoyi.net