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


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

Halo teman-teman semuanya, pada artikel sebelumnya kita telah belajar bagaimana cara menampilkan data di Preact melalui Rest API dan sekarang kita semua akan belajar bagaimana cara melakukan proses insert dan upload data di dalam Preact dengan Rest API.

Langhkah 1 - Insert dan Upload Data di Preact

Silahkan teman-teman buka file src/pages/posts/create.jsx, kemudian ubah semua kode-nya menjadi seperti berikut ini.

src/pages/posts/create.jsx

//import useState
import { useState } from "preact/hooks";

//import route
import { route } from "preact-router";

//import API
import api from "../../services/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([]);

  //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
        route("/posts", true);
      })
      .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 hook useState dari Preact Hooks.

//import useState
import { useState } from "preact/hooks";

Kemudian kita import route dari Preact Router. Ini digunakan untuk melakukan redirect ke halaman lain nantinya.

//import route
import { route } from "preact-router";

Dan kita import services API yang sudah kita buat sebelumnya.

//import API
import api from "../../services/api";

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

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

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

kemudian kita buat method baru dengan nama handleFileChange, method ini akan dijalankan saat kita memilih gambar di form upload.

<input
  type="file"
  onChange={handleFileChange}
  className="form-control"
/>
//method handle file change
const handleFileChange = (e) => {
  setImage(e.target.files[0]);
};

Di dalam method tersebut, kita melakukan assign value gambar ke dalam state image menggunakan state handlernya, yaitu setImage.

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

<form onSubmit={storePost}>

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

	//...
	
}

Di dalam method tersebut, pertama kita lakukan inisialisasi FormData. Ini karena kita akan mengirimkan sebuah file ke dalam server / backend.

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

kemudian kita lakukan append, yaitu memasukkan data di dalam FormData.

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

Di atas, untuk append memiliki 2 parameter. Parameter yang pertama adalah key dan parameter kedua adalah value dan untuk value diambil dari state.

Setelah data berhasil dimasukkan di dalam FormData, maka langkah selanjutnya adalah mengirimkan data tersebut ke server / backend.

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

Jika proses insert dan upload berhasil dilakukan, maka kita akan arahkan ke halaman posts index menggunakan route.

//redirect to posts index
route("/posts", true);

Tapi jika gagal, maka kita akan assign error validasi dari backend ke dalam state errors menggunakan state handlernya, yaitu setErrors.

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

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

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

Langkah 2 - Uji Coba Insert dan Upload di Preact

Silahkan teman-teman klik button ADD NEW POST pada halaman posts index, jika berhasil maka akan membuka halaman post create, kurang lebih seperti berikut ini.

Silahkan klik button Save dengan tanpa mengisi data apapun, maka kita akan mendapatkan pesan validasi seperti berikut ini.

Sekarang, silahkan teman-teman isi data-nya dan klik button Save, jika berhasil maka kita akan diarahkan ke halaman posts index dengan menampilkan data yang baru saja ditambahkan.

Kesimpulan

Pada artikel ini, kita telah belajar bagaimana cara melakukan proses insert dan upload di dalam Preact menggunakan FormData dan Rest API.

Pada artikel selanjutnya, kita semua akan belajar bagaimana cara membuat proses edit dan update data di Preact 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