Vue 3 Composition API: Pola yang Benar untuk Project Nyata
Vue 3 Composition API: Pola yang Benar untuk Project Nyata - Vue 3 memperkenalkan Composition API sebagai alternatif dari Options API. Banyak developer langsung menggunakannya karena lebih fleksibel dan modern.
Masalahnya, banyak implementasi Composition API yang justru membuat file semakin berantakan ketika project membesar.
Di artikel ini kita akan membahas pola Composition API yang benar untuk project nyata, bukan sekadar contoh counter sederhana.
Kenapa Banyak Project Vue 3 Jadi Berantakan?
Contoh yang sering terjadi:
<script setup>
const users = ref([])
const loading = ref(false)
const error = ref(null)
const fetchUsers = async () => {
loading.value = true
try {
const res = await $fetch('/api/users')
users.value = res
} catch (e) {
error.value = e
} finally {
loading.value = false
}
}
const deleteUser = async (id) => {
await $fetch(`/api/users/${id}`, { method: 'DELETE' })
}
onMounted(fetchUsers)
</script>
Awalnya terlihat normal. Tapi ketika fitur bertambah:
- File jadi 400–600 baris
- Logic campur UI
- Sulit di-maintain
- Testing susah
Pola yang Benar: Separation of Concerns
Prinsip utama project besar adalah pisahkan tanggung jawab.
- UI → Component
- Logic → Composable
- API Call → Service
- Global State → Store (Pinia)
1️⃣ Composable untuk Logic Reusable
Buat folder composables/ lalu buat file:
composables/useUsers.js
import { ref } from 'vue'
import { usersService } from '@/services/usersService'
export function useUsers() {
const users = ref([])
const loading = ref(false)
const error = ref(null)
const fetchUsers = async () => {
loading.value = true
error.value = null
try {
users.value = await usersService.list()
} catch (e) {
error.value = e
} finally {
loading.value = false
}
}
const removeUser = async (id) => {
await usersService.remove(id)
await fetchUsers()
}
return { users, loading, error, fetchUsers, removeUser }
}
Sekarang logic sudah terpisah dari komponen.
2️⃣ Service untuk API Call
services/usersService.js
export const usersService = {
async list() {
return await $fetch('/api/users')
},
async remove(id) {
return await $fetch(`/api/users/${id}`, {
method: 'DELETE'
})
}
}
Dengan pola ini, kalau besok kamu ganti backend atau baseURL, cukup ubah di satu tempat.
3️⃣ Component Fokus ke UI
<script setup>
const { users, loading, fetchUsers, removeUser } = useUsers()
onMounted(fetchUsers)
</script>
<template>
<div>
<h1>User List</h1>
<div v-if="loading">Loading...</div>
<ul>
<li v-for="user in users" :key="user.id">
{{ user.name }}
<button @click="removeUser(user.id)">Delete</button>
</li>
</ul>
</div>
</template>
Component sekarang bersih dan mudah dibaca.
Kapan Gunakan Composable?
Gunakan composable jika:- Logic dipakai lebih dari satu komponen
- Ada state + side effect
- Ingin membuat domain logic terpisah
Pola Folder untuk Project Nyata
src/
├─ components/
├─ composables/
├─ services/
├─ stores/
├─ pages/
└─ utils/
Struktur ini membuat project tetap scalable saat fitur bertambah.
Error Umum Composition API
1️⃣ Semua Logic Ditaruh di Page
Solusi: pindahkan ke composable.2️⃣ Store Dipakai untuk Semua Hal
Solusi: gunakan store hanya untuk global state.3️⃣ Tidak Pisahkan API dan Logic
Solusi: buat service layer.Checklist Production Ready
- Composables terpisah per domain
- Service layer untuk API
- Component hanya fokus UI
- Store hanya global state
- Folder terstruktur rapi
Kesimpulan
Composition API bukan sekadar syntax baru di Vue 3. Ini adalah cara berpikir baru dalam menyusun aplikasi.
Kalau kamu ingin project Vue 3 yang scalable dan siap dikerjakan tim, gunakan pola:
- UI di component
- Logic di composable
- API di service
- State global di store
Dengan pola ini, project kamu akan lebih bersih, mudah dikembangkan, dan siap untuk production.
.png)
Post a Comment