子から親へ: emitでイベントを通知する
子コンポーネントから親コンポーネントへデータを送り返したり、何らかの操作を親に伝えたりするには、 イベントを発行 (emit) します。子コンポーネントから「こういうことがあったよ !」と親に知らせるイメージです。
データフロー: 子 -> 親
+---------------------+
| 親 コンポーネント |
| (ParentComponent) |
+---------------------+
^
| データ渡し (emit)
|
+---------------------+
| 子 コンポーネント |
| (ChildComponent) |
+---------------------+
処理の流れ
-
子コンポーネントでの記述:
defineEmits()で発行するイベントを定義し、emit関数でイベントを発行します。<template> <button @click="sendDataToParent">親へデータを送る</button> </template> <script setup> import { defineEmits } from 'vue' // 'child-data-sent' という名前のイベントを定義 const emit = defineEmits(['child-data-sent']) const sendDataToParent = () => { // 'child-data-sent' イベントを発行し、データを一緒に渡す emit('child-data-sent', '子コンポーネントからのメッセージです !') } </script>defineEmits()は<script setup>構文でイベントを定義するためのマクロです。 (defineProps()と同様)emit関数の第 1 引数にイベント名、第 2 引数以降に渡したいデータを指定します。
-
親コンポーネントでの記述: 子コンポーネントのタグ上で、
@(v-onの略記) を使ってイベントを監視し、イベント発生時に実行するメソッドを定義します。<template> <ChildComponent @child-data-sent="handleChildData" /> <p v-if="receivedMessage">子から受け取ったメッセージ: {{ receivedMessage }}</p> </template> <script setup> import ChildComponent from './ChildComponent.vue' import { ref } from 'vue' const receivedMessage = ref('') const handleChildData = (data) => { receivedMessage.value = data console.log('親コンポーネントでイベントを受け取りました:', data) } </script>@child-data-sentのように、イベント名を@の後に記述します。- イベントハンドラーのメソッドの引数には、子から送られたデータが自動的に渡されます。
props と emit は、コンポーネント指向開発における基本的なデータ連携のパターンです。これらを使いこなすことで、整理されたコンポーネント構造を保ちながら、複雑な UI を実現できます。