Membuat Formulir Interaktif di Vue.js dengan Validasi Sederhana

Formulir adalah bagian integral dari hampir semua aplikasi web, mulai dari login, pendaftaran, input data, hingga feedback pengguna. Namun, membuat formulir yang interaktif dan sekaligus mudah digunakan oleh pengguna bisa menjadi tantangan, apalagi jika harus memikirkan validasi input, penanganan error, dan feedback visual.
Vue.js hadir sebagai solusi yang sangat efektif untuk membangun formulir yang reaktif, mudah dikelola, dan mudah divalidasi. Dengan bantuan directive seperti v-model
, v-if
, dan computed properties, kita bisa dengan cepat membangun formulir yang responsif terhadap input pengguna dan mampu memberikan umpan balik instan jika terjadi kesalahan input.
Dalam artikel ini, kita akan belajar bagaimana membuat formulir interaktif di Vue 3 dengan pendekatan komponen single-file (.vue
) menggunakan script setup
. Kita akan mengimplementasikan validasi sederhana — seperti memastikan input tidak kosong dan memeriksa format email — untuk menjaga integritas data pengguna.
Struktur Dasar Formulir di Vue
Sebelum kita menambahkan validasi, mari kita mulai dengan struktur dasar formulir. Di Vue, pengisian data oleh pengguna umumnya diikat dengan directive v-model
, sehingga setiap kali pengguna mengetik atau memilih sesuatu, data model di JavaScript otomatis diperbarui. Ini memungkinkan kita untuk merespons input pengguna secara langsung, misalnya dengan memberikan peringatan jika ada input yang salah atau belum diisi.
Contoh Awal: Formulir Pendaftaran Dasar
<template>
<form @submit.prevent="submitForm">
<div>
<label>Nama:</label>
<input type="text" v-model="form.nama" />
</div>
<div>
<label>Email:</label>
<input type="email" v-model="form.email" />
</div>
<div>
<label>Password:</label>
<input type="password" v-model="form.password" />
</div>
<button type="submit">Kirim</button>
</form>
</template>
<script setup>
import { ref } from 'vue';
const form = ref({
nama: '',
email: '',
password: ''
});
function submitForm() {
console.log('Data terkirim:', form.value);
}
</script>
Penjelasan:
v-model
mengikat nilai input ke objekform
secara dua arah.- Event
@submit.prevent
mencegah reload halaman dan memanggilsubmitForm()
saat form dikirim.
Namun, saat ini formulir kita belum melakukan validasi apapun. Mari kita tambahkan validasi sederhana.
Menambahkan Validasi Sederhana
Validasi formulir adalah proses memeriksa apakah data yang dimasukkan oleh pengguna sudah sesuai dengan harapan, seperti:
- Nama tidak boleh kosong.
- Email harus dalam format yang valid.
- Password minimal 6 karakter.
Langkah 1: Menyimpan Pesan Error
Kita akan membuat objek errors
untuk menyimpan pesan-pesan kesalahan input. Objek ini akan digunakan untuk memberikan feedback visual kepada pengguna.
const errors = ref({
nama: '',
email: '',
password: ''
});
Langkah 2: Fungsi Validasi
Kita akan membuat fungsi validateForm()
yang memeriksa setiap field dan mengisi objek errors
jika ada input yang tidak valid.
function validateForm() {
let valid = true;
errors.value = {
nama: '',
email: '',
password: ''
};
if (!form.value.nama) {
errors.value.nama = 'Nama wajib diisi.';
valid = false;
}
if (!form.value.email) {
errors.value.email = 'Email wajib diisi.';
valid = false;
} else if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(form.value.email)) {
errors.value.email = 'Format email tidak valid.';
valid = false;
}
if (!form.value.password) {
errors.value.password = 'Password wajib diisi.';
valid = false;
} else if (form.value.password.length < 6) {
errors.value.password = 'Password minimal 6 karakter.';
valid = false;
}
return valid;
}
Penjelasan:
- Fungsi ini melakukan validasi satu per satu pada tiap field.
- Jika ada kesalahan, pesan kesalahan dimasukkan ke dalam
errors
, dan fungsi mengembalikanfalse
.
Menghubungkan Validasi ke Formulir
Kita perlu memanggil validateForm()
sebelum mengirim data. Jika validasi berhasil, baru kita lanjutkan proses submit.
Final Template dengan Validasi
<template>
<form @submit.prevent="submitForm" novalidate>
<div>
<label>Nama:</label>
<input v-model="form.nama" type="text" />
<p v-if="errors.nama" style="color: red;">{{ errors.nama }}</p>
</div>
<div>
<label>Email:</label>
<input v-model="form.email" type="email" />
<p v-if="errors.email" style="color: red;">{{ errors.email }}</p>
</div>
<div>
<label>Password:</label>
<input v-model="form.password" type="password" />
<p v-if="errors.password" style="color: red;">{{ errors.password }}</p>
</div>
<button type="submit">Kirim</button>
</form>
</template>
<script setup>
import { ref } from 'vue';
const form = ref({
nama: '',
email: '',
password: ''
});
const errors = ref({
nama: '',
email: '',
password: ''
});
function validateForm() {
let valid = true;
errors.value = {
nama: '',
email: '',
password: ''
};
if (!form.value.nama) {
errors.value.nama = 'Nama wajib diisi.';
valid = false;
}
if (!form.value.email) {
errors.value.email = 'Email wajib diisi.';
valid = false;
} else if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(form.value.email)) {
errors.value.email = 'Format email tidak valid.';
valid = false;
}
if (!form.value.password) {
errors.value.password = 'Password wajib diisi.';
valid = false;
} else if (form.value.password.length < 6) {
errors.value.password = 'Password minimal 6 karakter.';
valid = false;
}
return valid;
}
function submitForm() {
if (validateForm()) {
alert('Data berhasil dikirim:\n' + JSON.stringify(form.value, null, 2));
}
}
</script>
Peningkatan: Menambahkan Class Error untuk Visual yang Lebih Baik
Selain menampilkan pesan kesalahan, kamu juga bisa menambahkan class CSS agar input yang salah terlihat lebih jelas.
Tambahkan Class pada Input
<input
v-model="form.email"
type="email"
:class="{ 'input-error': errors.email }"
/>
Tambahkan CSS
<style scoped>
.input-error {
border: 1px solid red;
}
</style>
Dengan Vue.js, membuat formulir yang interaktif dan validasi yang responsif bisa dilakukan dengan sangat mudah. Kita memanfaatkan:
v-model
untuk binding dua arah antara data dan input.v-if
untuk menampilkan pesan error hanya saat terjadi kesalahan.- Struktur data dan fungsi validasi sederhana untuk menjaga kualitas input pengguna.
Walaupun kita baru menerapkan validasi sederhana, pola ini sudah cukup untuk sebagian besar kebutuhan dasar aplikasi. Untuk validasi yang lebih kompleks dan terstruktur, kamu bisa menggunakan library seperti VeeValidate atau Yup.