Tutorial Solid Js dan Laravel #5 : Edit dan Update Data di Solid dengan Rest API


Tutorial Solid Js dan Laravel #5 : Edit dan Update Data di Solid dengan Rest API

Halo teman-teman semuanya, pada artikel kali ini kita semua akan belajar bagaimana cara melakukan proses edit dan update data di dalam Solid Js dengan Rest API. Pada proses edit data, kita memberikan kondisi untuk data gambar, yaitu brsifat opsional atau tidak wajib diubah.

Langkah 1 - Edit dan Update Data di Solid Js

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

src/pages/posts/edit.jsx

//import createSignal
import { createSignal, createEffect } from "solid-js";

//import from @solidjs/router
import { useNavigate, useParams } from "@solidjs/router";

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

export default function PostEdit() {
  //init navigate
  const navigate = useNavigate();

  //destruct id from params
  const { id } = useParams();

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

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

  //method fetchDetailPost
  const fetchDetailPost = async () => {
    //fetch data
    await api.get(`/api/posts/${id}`).then((response) => {
      //assign to state
      setTitle(response.data.data.title);
      setContent(response.data.data.content);
    });
  };

  //hook createEffect
  createEffect(() => {
    //call method "fetchDetailPost"
    fetchDetailPost();
  }, []);

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

  //method update post
  const updatePost = async (e) => {
    e.preventDefault();

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

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

    //send data with API
    await api
      .post(`/api/posts/${id}`, formData)
      .then(() => {
        //redirect to posts index
        return navigate("/posts", { replace: true });
      })
      .catch((error) => {
        //set errors response to state "errors"
        setErrors(error.response.data);
      });
  };

  return (
    <div className="row mt-5">
      <div className="col-md-12">
        <div className="card border-0 rounded shadow">
          <div className="card-body">
            <form onSubmit={updatePost}>
              <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"
                  value={title()}
                  onChange={(e) => setTitle(e.currentTarget.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"
                  value={content()}
                  onChange={(e) => setContent(e.currentTarget.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"
              >
                Update
              </button>
            </form>
          </div>
        </div>
      </div>
    </div>
  );
}

Dari perubahan kode di atas, pertama kita import hook createSignal dan createEffect dari Solid Js.

//import createSignal
import { createSignal, createEffect } from "solid-js";

Kemudian kita import 2 hook dari Solid Router, yaitu useNavigate dan useParams.

//import from @solidjs/router
import { useNavigate, useParams } from "@solidjs/router";

Dan kita import services API yang sudah kita buat sebelumnya.

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

Di dalam function component PostEdit, pertama-tama kita inisialisasi dulu navigate dan melakukan destructuring id dari parameter browser.

//init navigate
const navigate = useNavigate();

//destruct id from params
const { id } = useParams();

Setelah itu, kita buat beberapa state yang nanti digunakan untuk menampung nilai yang ada di dalam form.

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

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

Selanjutnya, kita buat method baru dengan nama fetchDetailPost, method ini akan digunakan untuk mendapatkan detail data dari backend berdasarkan ID.

//method fetchDetailPost
const fetchDetailPost = async () => {

	//...
	
}

Di dalam method tersebut kita melakuakn fetching data ke backend melalui endpoint /api/posts/:id menggunakan method GET.

//fetch data
await api.get(`/api/posts/${id}`).then((response) => {

	//...
	
}

Jika proses fetch data berhasil dilakukan, maka kita akan assign response data ke dalam state title dan content.

//assign to state
setTitle(response.data.data.title);
setContent(response.data.data.content);

Agar method di atas dijalankan saat halaman diakses, maka kita perlu memanggilnya di dalam hook createEffect.

//hook createEffect
createEffect(() => {
  //call method "fetchDetailPost"
  fetchDetailPost();
}, []);

Kemudian kita buat method lagi yang berfungsi untuk menghandle file upload.

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

Terakhir, kita buat method lagi untuk proses update data post, method tersebut kita beri nama updatePost. Method ini akan dijalankan saat form disubmit.

<form onSubmit={updatePost}>

	//...
	
</form>
//method update post
const updatePost = async (e) => {

	//...
	
}

Di dalam method tersebut, pertama kita inisialisasi FormData, karena kita akan mengirimkan file ke dalam backend.

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

kemudia kita append atau masukkan state ke dalam form data.

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

Jika teman-teman perhatikan, di atas kita menambahkan key _method dan isinya adalh PUT. Itu berguna untuk memberi tahu Laravel bahwa kita sedang melakukan proses update data.

Setelah itu, kita tinggal kirimkan data-nya ke backend / Laravel menggunakan endpoint /api/posts/:id dengan method POST.

//send data with API
await api.post(`/api/posts/${id}`, formData)

Jika proses update data berhasil dilakukan, maka kita akan arahkan ke dalama halaman posts index menggunakan navigate.

//redirect to posts index
return navigate("/posts", { replace: true });

Jika gaga, maka kita akan assign response error validasi dari backend / Laravel ke dalam state errors.

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

Langkah 2 - Uji Coba Edit dan Update Data

Sekarang, silahkan teman-teman klik button EDIT disala satu data yang dimiliki, jika berhasil maka akan menampilkan hasil seperti berikut ini.

Silahkan sesuaikan isi yang ada di dalam form, kemudian klik button Update, jika berhasl maka kita akan diarahkan ke halaman posts index dengan data yang telah diperbarui.

Kesimpulan

Pada artikel ini kita telah belajar bagaiana cara membuat proses edit dan update data di Solid Js melalui Rest API.

Pada artikel berikutnya, kita semua akan belajar bagaimana cara membuat proses delete data post di Solid Jbs 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