Tutorial React dan Laravel 10 #4: Insert dan Upload Data di React dengan Rest API


Tutorial React dan Laravel 10 #4: Insert dan Upload Data di React dengan Rest API

Halo teman-teman semuanya, pada artikel sebelumnya kita telah belajar bagaimana cara menampilkan data di React dari Rest API yang dibuat dari Laravel. Dan sekarang kita semua akan belajar bagaimana cara melakukan proses insert dan upload di dalam React menggunakan Rest API.

Langkah 1 - Insert dan Upload Data di React

Sekarang kita akan melakukan perubahan di dalam view post create, silahkan teman-teman buka file src/views/posts/create.jsx, kemudian ubah semua kode-nya menjadi seperti berikut ini.

//import useState
import { useState } from 'react';

//import useNavigate
import { useNavigate } from 'react-router-dom';

//import API
import api from '../../api';

export default function PostCreate() {

    //define state
    const [image, setImage] = useState('');
    const [title, setTitle] = useState('');
    const [content, setContent] = useState('');

    //state validation
    const [errors, setErrors] = useState([]);

    //useNavigate
    const navigate = useNavigate();

    //method handle file change
    const handleFileChange = (e) => {
        setImage(e.target.files[0]);
    }

    //method store post
    const storePost = async (e) => {
        e.preventDefault();
        
        //init FormData
        const formData = new FormData();

        //append data
        formData.append('image', image);
        formData.append('title', title);
        formData.append('content', content);

        //send data with API
        await api.post('/api/posts', formData)
            .then(() => {
                
                //redirect to posts index
                navigate('/posts');

            })
            .catch(error => {
                
                //set errors response to state "errors"
                setErrors(error.response.data);
            })
    }

    return (
        <div className="container mt-5">
            <div className="row">
                <div className="col-md-12">
                    <div className="card border-0 rounded shadow">
                        <div className="card-body">
                            <form onSubmit={storePost}>
                            
                                <div className="mb-3">
                                    <label className="form-label fw-bold">Image</label>
                                    <input type="file" onChange={handleFileChange} className="form-control"/>
                                    {
                                        errors.image && (
                                            <div className="alert alert-danger mt-2">
                                                {errors.image[0]}
                                            </div>
                                        )
                                    }
                                </div>

                                <div className="mb-3">
                                    <label className="form-label fw-bold">Title</label>
                                    <input type="text" className="form-control" onChange={(e) => setTitle(e.target.value)} placeholder="Title Post"/>
                                    {
                                        errors.title && (
                                            <div className="alert alert-danger mt-2">
                                                {errors.title[0]}
                                            </div>
                                        )
                                    }
                                </div>

                                <div className="mb-3">
                                    <label className="form-label fw-bold">Content</label>
                                    <textarea className="form-control" onChange={(e) => setContent(e.target.value)} rows="5" placeholder="Content Post"></textarea>
                                    {
                                        errors.content && (
                                            <div className="alert alert-danger mt-2">
                                                {errors.content[0]}
                                            </div>
                                        )
                                    }
                                </div>

                                <button type="submit" className="btn btn-md btn-primary rounded-sm shadow border-0">Save</button>
                            </form>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    )
}

Dari perubahan kode di atas, pertama kita import useState dari React.

//import useState
import { useState } from 'react';

Kemudian kita import useNavigate dari React Router DOM. Ini akan kita gunakan untuk melakukan navigasi atau redirect nanti setelah proses insert data berhasil dilakukan.

//import useNavigate
import { useNavigate } from 'react-router-dom';

Karena akan berinterasksi dengan API, maka kita import konfigurasi API yang sudah kita buat sebelumnya.

//import API
import api from '../../api';

Di dalam function component PostCreate kita membuat beberapa state, yang mana nanti digunakan untuk menampung data yang diinput di dalam form.

//define state
const [image, setImage] = useState('');
const [title, setTitle] = useState('');
const [content, setContent] = useState('');

//state validation
const [errors, setErrors] = useState([]);

Untuk mempermudah dalam menggunakan hook useNavigate, maka kita masukkan ke dalam sebuah variable.

//useNavigate
const navigate = useNavigate();

Kemudian kita buat method baru dengan nama handleFileChange. Method ini yang digunakan untuk memasukkan file yang diambil dari komputer ke dalam state image.

//method handle file change
const handleFileChange = (e) => {
    setImage(e.target.files[0]);
}

Method handleFileChange di atas akan dijalankan, ketika input file gambar di dalam form dipilih.

<input type="file" onChange={handleFileChange} className="form-control"/>

Setelah itu, kita buat method lagi dengan nama storePost. Method ini akan dijalankan ketika form disubmit.

<form onSubmit={storePost}>

	//...
	
</form>
//method store post
const storePost = async (e) => {

	//...
	
}

Di dalam method storePost di atas, pertama kita inisialisasi FormData. Karena kita akan melakukan upload gambar, maka kita harus menggunakan FormData agar file bisa dikirim ke server.

//init FormData
const formData = new FormData();

Setelah berhasil di inisialisasi, langkah berikutnya adalah memasukkan data yang ada di dalam state ke dalam FormData, yaitu dengan menggunakan append.

//append data
formData.append('image', image);
formData.append('title', title);
formData.append('content', content);

Setelah data berhasil dimasukkan ke dalam FormData, langkah berikutnya adalah melakukan kirim data menggunakan Rest API dengan bantuan Axios, yaitu menggunakan method POST.

//send data with API
await api.post('/api/posts', formData)

Jika proses insert dan upload data berhasil dilakukan di dalam server, maka kita akan redirect ke dalam halaman posts index.

//redirect to posts index
navigate('/posts');

Tapi jika data gagal disimpan, maka kita akan memasukkan error response validasi ke dalam state yang bernama errors.

//set errors response to state "errors"
setErrors(error.response.data);

Dan untuk menampilkan error di dalam template, kita bisa menggunakan kode seperti berikut ini.

{
    errors.image && (
        <div className="alert alert-danger mt-2">
            {errors.image[0]}
        </div>
    )
}

Langkah 2 - Uji Coba Insert dan Upload di React

Silahkan teman-teman klik button ADD NEW POST yang ada pada halaman posts index atau juga bisa melalui link berikut ini http://localhost:5173/posts/create, jika berhasil maka akan menampilkan halaman seperti berikut.

Silahkan klik button Save tanpa mengisi data apapun di dalam form, maka kita akan mendapatkan error validasi yang dikirimkan oleh Laravel melaluio Rest API.

Sekarang, silahkan masukkan data yang diinginkan di dalam form dan teman-teman klik Save. Jika berhasil maka kita akan diarahakan ke halaman posts index dengan data yang berhasil disimpan.

Kesimpulan

Pada artikel kali ini kita telah belajar bagaimana cara membuat proses insert data dan upload gambar di dalam React. Kita juga belajar menggunakan FormData untuk mengirim file ke dalam server.

Pada artikel selanjutnya kita semua akan belajar bagaimana cara membuat proses edit dan update data di dalam React menggunakan Rest API.

Terima Kasih



Fika Ridaul Maulayya
Full-Stack Developer, Content Creator and CO-Founder SantriKoding.com

Suka dengan tulisan di SantriKoding? Kamu bisa memberikan dukungan dengan berdonasi atau bagikan konten ini di sosial media. Terima kasih atas dukungan Anda!

KEBIJAKAN KOMENTAR

Saat memberikan komenatar silahkan memberikan informasi lengkap tentang error, seperti: screenshot, link kode, dll. Baca aturan komentar kami