Vue组件通信讲解[父子组件通信]

Vue组件通信讲解

在Vue中,父子组件之间的通信可以通过props和emit来实现。props用于从父组件向子组件传递数据,而$emit用于从子组件向父组件触发事件。

以下是一个包含子传父和父传子通信的Vue案例解决方案:

父组件:Parent.vue

js 复制代码
<template>
  <div>
    <h2>父组件</h2>
    <p>子组件传递的数据:{{ messageFromChild }}</p>
    <Child :message="messageFromParent" @childEvent="handleChildEvent" />
  </div>
</template>

<script>
import Child from "./Child.vue";

export default {
  data() {
    return {
      messageFromParent: "Hello from parent",
      messageFromChild: ""
    };
  },
  components: {
    Child
  },
  methods: {
    handleChildEvent(message) {
      this.messageFromChild = message;
    }
  }
};
</script>

子组件:Child.vue

js 复制代码
<template>
  <div>
    <h3>子组件</h3>
    <p>父组件传递的数据:{{ message }}</p>
    <button @click="sendMessageToParent">向父组件发送消息</button>
  </div>
</template>

<script>
export default {
  props: {
    message: String
  },
  methods: {
    sendMessageToParent() {
      this.$emit("childEvent", "Hello from child");
    }
  }
};
</script>

在上述示例中,父组件(Parent.vue)通过将messageFromParent作为props传递给子组件(Child.vue),同时监听子组件的childEvent事件。当子组件触发childEvent事件时,父组件的handleChildEvent方法会被调用,并将子组件传递的消息更新到messageFromChild属性上。这样就实现了子传父的通信。

另外,子组件中的按钮点击事件sendMessageToParent通过this.$emit方法向父组件触发childEvent事件,并将消息作为参数传递给父组件,实现了父传子的通信。

实现Vue中的父子组件通信时 ,除了使用props 和$emit方法,还有其他一些方法可以实现更复杂的场景。

1. 使用$refs:可以通过在父组件中使用ref属性来获取子组件的引用,并直接访问子组件的属性和方法。这种方法适用于父组件需要直接操作子组件的情况。

父组件:Parent.vue

js 复制代码
<template>
  <div>
    <h2>父组件</h2>
    <button @click="callChildMethod">调用子组件方法</button>
    <Child ref="childComponent" />
  </div>
</template>

<script>
import Child from "./Child.vue";

export default {
  components: {
    Child
  },
  methods: {
    callChildMethod() {
      this.$refs.childComponent.childMethod();
    }
  }
};
</script>

子组件:Child.vue

js 复制代码
<template>
  <div>
    <h3>子组件</h3>
  </div>
</template>

<script>
export default {
  methods: {
    childMethod() {
      console.log("子组件方法被调用");
    }
  }
};
</script>

在上述示例中,父组件通过ref属性给子组件命名为"childComponent",然后可以使用this.$refs.childComponent来访问子组件的属性和方法。父组件中的callChildMethod方法调用了子组件的childMethod方法。

2. 使用事件总线:可以创建一个用于中央事件处理的事件总线实例,让父组件和子组件通过事件触发和监听进行通信。这种方法适用于非父子关系组件之间的通信。

事件总线:eventBus.js

js 复制代码
import Vue from "vue";
export const eventBus = new Vue();

父组件:Parent.vue

js 复制代码
<template>
  <div>
    <h2>父组件</h2>
    <button @click="sendMessageToChild">向子组件发送消息</button>
  </div>
</template>

<script>
import { eventBus } from "./eventBus";

export default {
  methods: {
    sendMessageToChild() {
      eventBus.$emit("messageToChild", "Hello from parent");
    }
  }
};
</script>

子组件:Child.vue

js 复制代码
<template>
  <div>
    <h3>子组件</h3>
  </div>
</template>

<script>
import { eventBus } from "./eventBus";

export default {
  created() {
    eventBus.$on("messageToChild", message => {
      console.log("子组件收到消息:" + message);
    });
  }
};
</script>

在上述示例中,通过创建一个名为eventBus的事件总线实例,父组件可以通过eventBus.$emit方法触发名为"messageToChild"的事件并传递消息。子组件通过eventBus.$on方法监听"messageToChild"事件,并在事件触发时执行相应的回调函数。

Vue的组件通信有子传父和父传子,子传入父用emit发送回调函数,父传子直接在props中传入参数即可.

相关推荐
前端工作日常2 分钟前
H5 实时摄像头 + 麦克风:完整可运行 Demo 与深度拆解
前端·javascript
韩沛晓12 分钟前
uniapp跨域怎么解决
前端·javascript·uni-app
前端工作日常13 分钟前
以 Vue 项目为例串联eslint整个流程
前端·eslint
程序员鱼皮15 分钟前
太香了!我连夜给项目加上了这套 Java 监控系统
java·前端·程序员
Rubin9336 分钟前
TS 相关
javascript
该用户已不存在41 分钟前
这几款Rust工具,开发体验直线上升
前端·后端·rust
前端雾辰1 小时前
Uniapp APP 端实现 TCP Socket 通信(ZPL 打印实战)
前端
无羡仙1 小时前
虚拟列表:怎么显示大量数据不卡
前端·react.js
云水边1 小时前
前端网络性能优化
前端
用户51681661458411 小时前
[微前端 qiankun] 加载报错:Target container with #child-container not existed while devi
前端