Tutorial Astro, React & Laravel #6 : Edit & Update Data di Astro


👍 0 ❤️ 0 💡 0 🔥 0 🙌 0 🥳 0
Tutorial Astro, React & Laravel #6 : Edit & Update Data di Astro

Halo teman-teman semuanya, pada artikel sebelumnya kita bersama telah belajar bagaimana cara membuat proses insert dan upload di dalam Astro dan React. Dan sekarang kita akan lanjutkan belajar bagaimana cara membuat proses edit dan update data di Astro dan React.

Langkah 1 - Membuat Component Post Edit (React)

Silahkan teman-teman buat file baru dengan nama PostEdit.jsx di dalam folder src/components, kemudian masukkan kode berikut ini di dalamnya.

javascript
//import useState import { useState } from "react"; //import API import api from "../services/api"; export default function PostEdit({ postID, postTitle, postContent }) { //define state const [image, setImage] = useState(""); const [title, setTitle] = useState(postTitle); const [content, setContent] = useState(postContent); //state validation const [errors, setErrors] = useState([]); //method handle file change const handleFileChange = (e) => { setImage(e.target.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/${postID}`, formData) .then(() => { //redirect to posts index window.location.href = "/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={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.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" value={content} 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" > Update </button> </form> </div> </div> </div> </div> </div> ); }

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

javascript
//import useState import { useState } from "react";

Kemudian kita import services API yang sudah kita buat sebelumnya.

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

Di dalam function component PostEdit kita memberikan 3 parameter berupa props, yaitu postID, postTitle dan postContent. Ketiga props tersebut nanti akan berisi data yang dikirimkan oleh component Astro.

javascript
export default function PostEdit({ postID, postTitle, postContent }) { //... }

Kemudian kita buat beberapa state yang digunakan untuk menyimpan data.

cpp
//define state const [image, setImage] = useState(""); const [title, setTitle] = useState(postTitle); const [content, setContent] = useState(postContent); //state validation const [errors, setErrors] = useState([]);

Setelah itu, Kita buat method lagi untuk menghandle file yang akan diupload.

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

Terakhir, kita buat method yang bernama updatePost. Method ini akan dijalakan ketika form disumbit.

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

Di dalam method di atas, sama seperti yang ada pada method storePost pada pembahasan artikel sebelumnya, bedanya disini kita tambahkan sebuah key _method dengan value PUT pada append. Karena data yang dikirimkan adalah proses update data.

go
//init FormData const formData = new FormData(); //append data formData.append('image', image); formData.append('title', title); formData.append('content', content); formData.append('_method', 'PUT')

Setelah itu, kita tinggal kirimkan data-nya melalui Axios dengan method POST.

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

Jika proses update data berhasil dilakukan, maka kita redirect atau arahkan pada halaman posts index.

javascript
//redirect to posts index window.location.href = "/posts";

Jika data gagal diupdate, maka kita assign error response validasinya ke dalam state errors.

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

Jangan lupa pada input di dalam form kita berikan value yang berisi state title dan content. Ini bertujuan agar menampilkan data yang akan diedit dan update.

typescript
<input type="text" className="form-control" value={title} onChange={(e) => setTitle(e.target.value)} placeholder="Title Post" />
javascript
<textarea className="form-control" value={content} onChange={(e) => setContent(e.target.value)} rows="5" placeholder="Content Post" ></textarea>

Langkah 2 - Menampilkan Form Post Edit di Astro

Sekarang silahkan teman-teman buat folder baru dengan nama edit di dalam folder src/pages/posts, kemudian di dalam folder edit tersebut silahkan buat file baru dengan nama [id].astro dan masukkan kode berikut ini di dalamnya.

javascript
--- //import transitions effect import { ViewTransitions } from "astro:transitions"; //import layout import MainLayout from "../../../layouts/MainLayout.astro"; //import form edit post import PostEdit from "../../../components/PostEdit.jsx"; //import service api import api from "../../../services/api"; //get ID const { id } = Astro.params; //fetch detail data const { data } = await api.get(`/api/posts/${id}`); --- <MainLayout> <ViewTransitions /> <div class="container mb-5" style="margin-top: 5rem;"> <div class="row"> <div class="col-md-12"> <PostEdit client:load postID={data.data.id} postTitle={data.data.title} postContent={data.data.content} /> </div> </div> </div> </MainLayout>

Dari penambahan kode di atas, pertama kita import ViewTransition dari Astro.

javascript
//import transitions effect import { ViewTransitions } from "astro:transitions";

kemudian kita import MainLayout.

javascript
//import layout import MainLayout from "../../../layouts/MainLayout.astro";

Dan kita import component React PostEdit.

javascript
//import form edit post import PostEdit from "../../../components/PostEdit.jsx";

Terakhir, kita import services API.

javascript
//import service api import api from "../../../services/api";

Setelah itu, kita akan mengambil ID yang ada di URL browser, yaitu dengan cara destructuring object dari Astro.params.

csharp
//get ID const { id } = Astro.params;

Kemudian kita melakukan fetch ke backend untuk mengambil detail data by ID.

javascript
//fetch detail data const { data } = await api.get(`/api/posts/${id}`);

Dan setelah data berhasil didapatkan, maka kita tinggal menaruhnya di dalam component PostEdit sebagai props.

kotlin
<PostEdit client:load postID={data.data.id} postTitle={data.data.title} postContent={data.data.content} />

Langkah 3 - Uji Coba Edit dan Update Data

Silahkan teman-teman klik button EDIT di salah satu data yang dimiliki, jika berhasil maka kita akan menampilkan halaman form edit data.

Silahkan sesuaikan isi di dalamnya dan klik UPDATE, jika berhasil maka kita akan diarahkan ke halaman posts index dengan data yang telah diperbarui.

Kesimpulan

Pada artikel ini kita semua telah belajar bagaimana cara membuat form edit di dalam React dan belajar mengirimkan data props dari Astro ke React.

Pada artikel berikutnya kita semua akan belajar bagaimana cara membuat proses delete data di Astro.

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