Perbedaan dan Penggunaan ref vs reactive dalam Reaktivitas Vue.js
Vue 3 hadir dengan Composition API yang memberi cara baru dalam mengelola state aplikasi. Dua fitur utamanya adalah ref dan reactive. Meski keduanya sama-sama berfungsi untuk membuat data menjadi reaktif, banyak pengembang pemula sering bingung kapan sebaiknya menggunakan ref dan kapan menggunakan reactive.
Artikel ini akan mengupas tuntas:
- Latar belakang reaktivitas Vue
- Cara kerja internal
refdanreactive - Perbedaan utama dengan contoh nyata
- Studi kasus kombinasi keduanya
- Tips best practice dalam memilih dan menggunakan
1. Latar Belakang Reaktivitas di Vue
Reaktivitas adalah konsep inti di Vue. Ibaratnya, ketika Anda mengubah sebuah nilai di JavaScript, Vue akan secara otomatis “mendengarkan” perubahan itu dan memperbarui tampilan di layar.
Contoh sederhana tanpa Vue:
let count = 0
document.querySelector('#btn').addEventListener('click', () => {
count++
document.querySelector('#text').innerText = count
})
Di Vue, kita tidak perlu repot mengupdate DOM secara manual, karena Vue menangani sinkronisasi data dan tampilan untuk kita. Inilah yang disebut reaktivitas.
2. Memahami ref
ref digunakan untuk membuat nilai primitif menjadi reaktif. Nilai seperti string, number, dan boolean biasanya tidak bisa dipantau secara langsung, maka Vue membungkusnya dalam sebuah objek dengan properti .value.
Contoh Dasar
<script setup>
import { ref } from 'vue'
const count = ref(0)
function increment() {
count.value++
}
</script>
<template>
<button @click="increment">
Count: {{ count }}
</button>
</template>
Penjelasan:
ref(0)membuat variabelcountmenjadi objek reaktif.- Nilai aktualnya ada di
count.value. - Di template, Vue otomatis unwrap
.value, jadi kita cukup menulis{{ count }}.
3. Memahami reactive
reactive digunakan untuk membuat objek atau array menjadi reaktif. Tidak ada .value karena Vue membuat seluruh properti di dalam objek menjadi “terobservasi”.
Contoh Dasar
<script setup>
import { reactive } from 'vue'
const user = reactive({
name: 'Budi',
age: 25
})
function growUp() {
user.age++
}
</script>
<template>
<p>{{ user.name }} berusia {{ user.age }}</p>
<button @click="growUp">Tambah Umur</button>
</template>
Penjelasan:
useradalah objek biasa, tapi sekarang semua propertinya (name,age) reaktif.- Vue otomatis memantau perubahan sehingga UI langsung ikut berubah.
4. Perbedaan Utama ref vs reactive
| Aspek | ref | reactive |
|---|---|---|
| Kegunaan utama | Nilai tunggal/primitif | Objek dan array |
| Cara akses | Gunakan .value di script, auto unwrap di template | Langsung akses properti |
| Reaktivitas | Hanya nilai di .value | Deep reactivity: semua properti dalam objek dipantau |
| Contoh cocok | Counter, boolean flag, string sederhana | Form dengan banyak field, state aplikasi kompleks |
| Kelebihan | Ringkas, sederhana, bisa juga membungkus objek | Lebih natural untuk objek, tidak perlu .value |
| Kekurangan | .value terasa aneh bagi pemula | Tidak bisa langsung untuk nilai primitif |
5. Contoh Praktis ref
a. Counter
<script setup>
import { ref } from 'vue'
const counter = ref(0)
</script>
<template>
<button @click="counter++">Klik: {{ counter }}</button>
</template>
b. Status Loading
<script setup>
import { ref } from 'vue'
const isLoading = ref(false)
</script>
<template>
<p>{{ isLoading ? 'Memuat data...' : 'Selesai' }}</p>
<button @click="isLoading = !isLoading">Toggle</button>
</template>
6. Contoh Praktis reactive
a. Form Input
<script setup>
import { reactive } from 'vue'
const form = reactive({
username: '',
email: '',
password: ''
})
</script>
<template>
<form>
<input v-model="form.username" placeholder="Username" />
<input v-model="form.email" placeholder="Email" />
<input v-model="form.password" type="password" placeholder="Password" />
</form>
<p>{{ form }}</p>
</template>
b. Daftar Todo
<script setup>
import { reactive } from 'vue'
const todos = reactive([
{ id: 1, text: 'Belajar Vue', done: false },
{ id: 2, text: 'Buat proyek kecil', done: true }
])
</script>
<template>
<ul>
<li v-for="todo in todos" :key="todo.id">
<input type="checkbox" v-model="todo.done" /> {{ todo.text }}
</li>
</ul>
</template>
7. Studi Kasus: Menggabungkan ref dan reactive
Dalam aplikasi nyata, kita sering memakai keduanya sekaligus.
<script setup>
import { ref, reactive } from 'vue'
const form = reactive({
username: '',
email: ''
})
const isSubmitting = ref(false)
function submitForm() {
isSubmitting.value = true
setTimeout(() => {
console.log(form)
isSubmitting.value = false
}, 1000)
}
</script>
<template>
<form @submit.prevent="submitForm">
<input v-model="form.username" placeholder="Username" />
<input v-model="form.email" placeholder="Email" />
<button type="submit" :disabled="isSubmitting">
{{ isSubmitting ? 'Mengirim...' : 'Kirim' }}
</button>
</form>
</template>
Di sini:
formdenganreactivekarena punya beberapa field.isSubmittingdenganrefkarena hanya sebuah boolean sederhana.
8. Best Practices
- Gunakan
refuntuk data primitif,reactiveuntuk objek/array. - Jangan takut menggabungkan keduanya.
- Jika punya state kompleks dengan banyak nested object, pertimbangkan
reactive. - Jika ingin memanfaatkan destructuring, hati-hati dengan
reactivekarena bisa kehilangan reaktivitas. GunakantoRefs()jika perlu.
Contoh:
import { reactive, toRefs } from 'vue'
const state = reactive({ a: 1, b: 2 })
const { a, b } = toRefs(state) // a dan b tetap reaktif
ref dan reactive adalah dua pilar utama reaktivitas di Vue 3.
- Gunakan
refuntuk nilai sederhana atau tunggal. - Gunakan
reactiveuntuk objek atau array dengan banyak properti. - Keduanya bisa dipakai bersamaan untuk membangun state aplikasi yang lebih kompleks.
Dengan memahami perbedaan dan penggunaan yang tepat, kita bisa menulis kode yang lebih rapi, konsisten, dan efisien dalam pengembangan aplikasi Vue.