深入理解 Vue 3 组件通信

在 Vue 3 中,组件通信是一个关键的概念,它允许我们在组件之间传递数据和事件。本文将介绍几种常见的 Vue 3 组件通信方法,包括 propsemitsprovide 和 inject、事件总线以及 Vuex 状态管理。

1. 使用 props 和 emits 进行父子组件通信

props 传递数据

props 是父组件向子组件传递数据的一种机制。在子组件中,通过定义 props 属性来接收父组件传递的数据。

父组件 (ParentComponent.vue):

<template>
  <ChildComponent :message="parentMessage" />
</template>

<script>
import ChildComponent from './ChildComponent.vue';

export default {
  components: {
    ChildComponent
  },
  data() {
    return {
      parentMessage: 'Hello from Parent Component!'
    };
  }
};
</script>

子组件 (ChildComponent.vue):

<template>
  <div>{{ message }}</div>
</template>

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

emits 传递事件

子组件可以通过 $emit 方法向父组件发送事件,从而实现从子组件向父组件传递信息。

子组件 (ChildComponent.vue):

<template>
  <button @click="sendMessage">Send Message</button>
</template>

<script>
export default {
  emits: ['messageSent'],
  methods: {
    sendMessage() {
      this.$emit('messageSent', 'Hello from Child Component!');
    }
  }
};
</script>

父组件 (ParentComponent.vue):

<template>
  <ChildComponent @messageSent="handleMessage" />
</template>

<script>
import ChildComponent from './ChildComponent.vue';

export default {
  components: {
    ChildComponent
  },
  methods: {
    handleMessage(message) {
      console.log(message);
    }
  }
};
</script>

2. 使用 provide 和 inject 进行祖孙组件通信

provide 和 inject 允许祖父组件和孙组件之间进行通信,而不需要通过中间的父组件传递数据。

祖父组件 (GrandparentComponent.vue):

<template>
  <ParentComponent />
</template>

<script>
import ParentComponent from './ParentComponent.vue';

export default {
  components: {
    ParentComponent
  },
  provide() {
    return {
      grandparentMessage: 'Hello from Grandparent Component!'
    };
  }
};
</script>

孙组件 (GrandchildComponent.vue):

<template>
  <div>{{ grandparentMessage }}</div>
</template>

<script>
export default {
  inject: ['grandparentMessage']
};
</script>

3. 使用事件总线进行兄弟组件通信

事件总线是一种常见的用于兄弟组件通信的方法,通常使用 Vue 实例作为事件总线。

事件总线 (eventBus.js):

import { reactive } from 'vue';

const eventBus = reactive({});
export default eventBus;

组件 A (ComponentA.vue):

<template>
  <button @click="sendMessage">Send Message to Component B</button>
</template>

<script>
import eventBus from './eventBus.js';

export default {
  methods: {
    sendMessage() {
      eventBus.message = 'Hello from Component A!';
    }
  }
};
</script>

组件 B (ComponentB.vue):

<template>
  <div>{{ message }}</div>
</template>

<script>
import { reactive, toRefs } from 'vue';
import eventBus from './eventBus.js';

export default {
  setup() {
    const state = reactive({
      message: ''
    });

    state.message = eventBus.message;

    return {
      ...toRefs(state)
    };
  }
};
</script>

文章转载自:最小生成树

原文链接:https://www.cnblogs.com/zx618/p/18310362

体验地址:引迈 - JNPF快速开发平台_低代码开发平台_零代码开发平台_流程设计器_表单引擎_工作流引擎_软件架构

相关推荐

  1. 深入理解 Vue 3 组件通信

    2024-07-20 04:04:04       22 阅读
  2. Vue3 深入组件

    2024-07-20 04:04:04       15 阅读
  3. Vue3父子组件通信

    2024-07-20 04:04:04       56 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-20 04:04:04       50 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-20 04:04:04       54 阅读
  3. 在Django里面运行非项目文件

    2024-07-20 04:04:04       43 阅读
  4. Python语言-面向对象

    2024-07-20 04:04:04       54 阅读

热门阅读

  1. 参考网站总结

    2024-07-20 04:04:04       20 阅读
  2. Spring注解开发

    2024-07-20 04:04:04       20 阅读
  3. C++ 数据结构

    2024-07-20 04:04:04       17 阅读
  4. PYQT按键长按机制

    2024-07-20 04:04:04       14 阅读
  5. godot使用ws

    2024-07-20 04:04:04       16 阅读
  6. mysql(四)

    2024-07-20 04:04:04       15 阅读
  7. Kubernetes Service 之 LoadBalancer

    2024-07-20 04:04:04       18 阅读
  8. 第五节 LLaVA模型lora推理模型解读(下篇)

    2024-07-20 04:04:04       16 阅读
  9. element ui 怎么调整table的行高

    2024-07-20 04:04:04       17 阅读