Lewati ke konten utama

📢 Emits & Custom Events di Vue.js

Selain props untuk mengirim data dari parent ke child, Vue juga menyediakan custom events untuk komunikasi sebaliknya: child ke parent. Ini dilakukan dengan menggunakan $emit.


🔁 1. Alur Komunikasi

Parent (Induk) --> [props] --> Child (Anak) Child (Anak) --> [$emit] --> Parent (Induk)


📦 2. Contoh Sederhana

🧱 Komponen Anak: CounterButton.vue

<template>
<button @click="handleClick">Tambah</button>
</template>

<script>
export default {
methods: {
handleClick() {
this.$emit('increment');
}
}
}
</script>

🏗️ Komponen Parent

<template>
<div>
<CounterButton @increment="count++" />
<p>Nilai: {{ count }}</p>
</div>
</template>

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

export default {
components: { CounterButton },
data() {
return {
count: 0
};
}
}
</script>

🧠 3. Mengirim Data melalui Event

Kamu bisa mengirim data bersamaan dengan event:

Komponen Anak:

this.$emit('submit-name', this.name);

Komponen Parent:

<ChildForm @submit-name="handleSubmit" />

methods: {
handleSubmit(name) {
console.log('Nama dikirim dari child:', name);
}
}

✏️ 4. Vue 3 — Emit Declaration (Opsional)

Jika kamu menggunakan Vue 3 + Composition API:

defineEmits(['submit-name'])

Atau:

const emit = defineEmits();
emit('submit-name', data);

💡 5. Penamaan Event

  • Gunakan kebab-case saat emit ('update-value')

  • Gunakan camelCase di method parent jika disukai (@updateValue)

  • Hindari nama yang ambigu seperti change, click — gunakan nama spesifik


📋 6. Event Modifiers (Parent Side)

Vue mendukung event modifier saat menangkap event:

<child-component @submit.prevent="handleSubmit" />

📌 Kesimpulan

  • Gunakan $emit untuk mengirim event dari child ke parent

  • Sertakan payload jika ingin mengirim data

  • Di parent, tangkap event menggunakan @eventName

  • Ini adalah metode komunikasi satu arah dari anak ke induk