• 父组件通过props向子组件传递数据。
  • 子组件通过$emit触发自定义事件,将信息传递回父组件。

父组件通过props向子组件传递数据

定义Props

首先,你需要在子组件中定义它能够接收的Props。这可以通过使用defineProps函数来完成。defineProps函数会返回一个对象,这个对象包含了所有Prop的响应式引用。

子组件 ChildComponent.vue

<template>
  <div>
    <p>从父组件接收到的消息: {{ message }}</p>
    <button @click="updateMessage">更新消息</button>
  </div>
</template>

<script setup>
// 定义Props
const props = defineProps({
  message: {
    type: String,
    required: true,
    default: '默认消息'
  }
})

// 更新消息后通知父组件
function updateMessage() {
  emit('update:message', '新的消息')
}
</script>

在这个例子中,message 是一个必需的字符串类型的Prop,如果未提供,则使用默认值 "默认消息"。

使用Props

接下来,在父组件中,你可以通过传递属性的方式将数据传递给子组件。

父组件 ParentComponent.vue

<template>
  <view>
    <ChildComponent :message="parentMessage" @update:message="onMessageUpdate" />
  </view>
</template>

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

// 父组件的数据
const parentMessage = ref('来自父组件的消息');

// 当子组件发出更新消息事件时,更新父组件的状态
function onMessageUpdate(newMessage) {
  parentMessage.value = newMessage;
}
</script>

在这个例子中,父组件通过:message绑定将parentMessage传递给了子组件。同时,当子组件触发update:message事件时,父组件会监听到并更新其内部的状态。

注意事项

  • 在定义Props时,推荐使用类型检查和默认值,以提高代码的健壮性和可读性。
  • 当Prop值变化时,组件内的响应式依赖会自动更新。
  • 如果需要在子组件中修改Prop传递过来的数据,通常的做法是通过自定义事件通知父组件更新数据,而不是直接修改Prop的值,因为直接修改Prop可能会导致不可预测的行为。

子组件通过$emit触发自定义事件,将信息传递回父组件

在Vue 3中,子组件向父组件通信最常见的做法是通过自定义事件(emits)。子组件通过$emit触发一个事件,并将数据传递给父组件,而父组件则通过事件监听器(@event-namev-on:event-name)来接收这些数据。

示例

下面是一个完整的示例,展示了如何在Vue 3中实现子组件向父组件通信的过程。

父组件 ParentComponent.vue

<template>
  <div>
    <h2>父组件接收的消息: {{ message }}</h2>
    <ChildComponent @child-event="handleChildEvent" />
  </div>
</template>

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

// 父组件的数据
const message = ref('');

// 当子组件发出事件时,更新父组件的状态
function handleChildEvent(data) {
  message.value = data;
}
</script>

在这个父组件中,我们创建了一个message响应式引用,并且设置了一个事件监听器@child-event,当子组件触发child-event事件时,就会调用handleChildEvent方法来更新message的值。

子组件 ChildComponent.vue

<template>
  <div>
    <button @click="sendMessage">发送消息给父组件</button>
  </div>
</template>

<script setup>
// 定义事件触发器
const emit = defineEmits(['child-event']);

// 发送消息给父组件
function sendMessage() {
  emit('child-event', '这是来自子组件的消息');
}
</script>

在这个子组件中,我们定义了一个按钮,当点击这个按钮时,会触发sendMessage方法。sendMessage方法通过emit函数触发child-event事件,并且传递一个字符串参数这是来自子组件的消息

解释

  1. defineEmits:这是Vue 3提供的一个组合API函数,用于定义子组件可以触发哪些事件。在这个例子中,我们定义了一个名为child-event的事件。
  2. emit:这是Vue 3提供的一个函数,用于触发事件。第一个参数是事件名称,后面的参数是传递给父组件的数据。
  3. 事件监听器:父组件通过@child-eventv-on:child-event来监听子组件触发的事件,并执行相应的处理函数。

动态事件名称

如果你需要使用动态事件名称,可以使用冒号:或者v-on来绑定事件。

<!-- 使用冒号 -->
<ChildComponent :on-child-event="handleChildEvent" />

<!-- 或者使用 v-on -->
<ChildComponent v-on:child-event="handleChildEvent" />

这样,child-event可以是一个变量的值,使得事件名称可以动态地变化。

通过这种方式,子组件可以有效地与父组件通信,传递数据或状态更新的通知。这是Vue中组件间通信的一种基本且常用的方式。

最后修改:2024 年 09 月 19 日
如果觉得我的文章对你有用,请随意赞赏