在 Vue 3 中,父子组件之间的通信通常通过 propsemits 来实现。props 用于从父组件向子组件传递数据,而 emits 则用于子组件向父组件发送事件和数据。下面是一个详细的示例,展示了如何使用 propsemits 在 Vue 3 中进行父子组件传值。

示例项目结构

假设我们的项目结构如下:

src/
  components/
    ChildComponent.vue
  App.vue
main.js

1. 从父组件向子组件传值 (props)

ChildComponent.vue

在子组件中,我们定义一个 props 接收来自父组件的数据:

<template>
  <div>
    <p>Message from parent: {{ message }}</p>
  </div>
</template>

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

<style scoped>
/* 样式代码 */
</style>
App.vue

在父组件中,我们使用 props 向子组件传递数据:

<template>
  <div id="app">
    <h1>Vue 3 Props and Emits Example</h1>
    <ChildComponent :message="parentMessage" />
  </div>
</template>

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

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

<style>
/* 样式代码 */
</style>

2. 从子组件向父组件发送事件 (emits)

ChildComponent.vue

在子组件中,我们定义一个方法来发送事件给父组件:

<template>
  <div>
    <p>Message from parent: {{ message }}</p>
    <button @click="sendMessageToParent">Send Message to Parent</button>
  </div>
</template>

<script>
export default {
  name: 'ChildComponent',
  props: {
    message: {
      type: String,
      required: true
    }
  },
  emits: ['messageFromChild'],
  methods: {
    sendMessageToParent() {
      this.$emit('messageFromChild', 'Hello from child!');
    }
  }
};
</script>

<style scoped>
/* 样式代码 */
</style>
App.vue

在父组件中,我们监听子组件发送的事件并处理它:

<template>
  <div id="app">
    <h1>Vue 3 Props and Emits Example</h1>
    <ChildComponent :message="parentMessage" @messageFromChild="handleMessageFromChild" />
    <p>Message from child: {{ childMessage }}</p>
  </div>
</template>

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

export default {
  name: 'App',
  components: {
    ChildComponent
  },
  data() {
    return {
      parentMessage: 'Hello from parent!',
      childMessage: ''
    };
  },
  methods: {
    handleMessageFromChild(message) {
      this.childMessage = message;
    }
  }
};
</script>

<style>
/* 样式代码 */
</style>

总结

通过以上示例,我们展示了如何使用 propsemits 在 Vue 3 中实现父子组件之间的通信:

  1. 使用 props 传递数据:父组件通过 props 向子组件传递数据。
  2. 使用 emits 发送事件:子组件通过 $emit 方法向父组件发送事件,父组件通过事件处理器接收和处理这些事件。

这种模式使得组件之间的通信变得清晰且易于维护。在大型应用程序中,这种方式有助于保持组件的独立性和可重用性。