Tutorial Express.js dan React.js #7 : Edit dan Update Data di React.js


Tutorial Express.js dan React.js #7 : Edit dan Update Data di React.js

Halo teman-teman semuanya, di artikel sebelumnya kita sudah belajar bagaimana cara membuat proses insert data di dalam React.js dengan memanfaatkan Rest API yang ada di dalam project Express.js. Dan di artikel kali ini kita semua akan belajar bagaimana cara membuat proses edit dan update data ke dalam database di dalam React.js.

Langkah 1 - Menambahkan Button Edit

Pertama-tama kita akan belajar bagaimana cara menampilkan button edit terlebih dahulu di dalam halaman post index, dimana ketika button ini di klik akan menuju ke dalam sebuah form yang berisi data yang akan di update.

Silahkan buka file src/pages/posts/Index.js, kemudian cari kode berikut ini :

{ posts.map((post, index) => (
    <tr key={ post.id }>
        <td>{ index + 1 }</td>
        <td>{ post.title }</td>
        <td>{ post.content }</td>
        <td className="text-center"></td>
    </tr>
)) }

Setelah itu, silahkan ubah menjadi seperti berikut ini :

{ posts.map((post, index) => (
    <tr key={ post.id }>
        <td>{ index + 1 }</td>
        <td>{ post.title }</td>
        <td>{ post.content }</td>
        <td className="text-center">
        	<Button as={Link} to={`/posts/edit/${post.id}`} variant="primary" size="sm" className="me-2">EDIT</Button>
        </td>
    </tr>
)) }

Di atas, kita menambahkan 1 button baru dengan nama EDIT dan kita arahkan ke dalam URL /posts/edit/:id. Dimana nilai :id akan diisi secara dinamis berdasarkan id dari data post.

Sekarang jika kita reload halaman post index, maka kita akan mendapatkan hasil kurang lebih seperti berikut ini :

Langkah 2 - Menambahkan Form Edit dan Proses Update

Setelah berhasil menambahkan button EDIT, sekarang kita lanjutkan untuk menampilkan data yang akan di update di dalam form edit. Disini kita akan melakukan perubahan kode di dalam halaman / component yang sudah kita buat sebelumnya.

Silahkan buka file src/pages/posts/Edit.js, kemudian ubah semua kode-nya menjadi seperti berikut ini :

//import hook useState dan useEffect from react
import { useState, useEffect } from 'react';

//import component Bootstrap React
import { Card, Container, Row, Col , Form, Button, Alert } from 'react-bootstrap';

//import axios
import axios from 'axios';

//import hook history dan params dari react router dom
import { useHistory, useParams } from "react-router-dom";

function EditPost() {

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

    //state validation
    const [validation, setValidation] = useState({});

    //history
    const history = useHistory();

    //get ID from parameter URL
    const { id } = useParams();

    //hook useEffect
    useEffect(() => {

        //panggil function "getPOstById"
        getPostById();
        
    }, []);

    //function "getPostById"
    const getPostById = async() => {

        //get data from server
        const response = await axios.get(`http://localhost:3000/api/posts/${id}`);
        //get response data
        const data = await response.data.data

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

    };

    //function "updatePost"
    const updatePost = async (e) => {
        e.preventDefault();
        
        //send data to server
        await axios.patch(`http://localhost:3000/api/posts/update/${id}`, {
            title: title,
            content: content
        })
        .then(() => {

            //redirect
            history.push('/posts');

        })
        .catch((error) => {

            //assign validation on state
            setValidation(error.response.data);
        })
        
    };

    return (
        <Container className="mt-3">
            <Row>
                <Col md="{12}">
                    <Card className="border-0 rounded shadow-sm">
                        <Card.Body>

                            {
                                validation.errors &&
                                    <Alert variant="danger">
                                        <ul class="mt-0 mb-0">
                                            { validation.errors.map((error, index) => (
                                                <li key={index}>{ `${error.param} : ${error.msg}` }</li>
                                            )) }
                                        </ul>
                                    </Alert>
                            }

                            <Form onSubmit={ updatePost }>
                                <Form.Group className="mb-3" controlId="formBasicEmail">
                                    <Form.Label>TITLE</Form.Label>
                                    <Form.Control type="text" value={title} onChange={(e) => setTitle(e.target.value)} placeholder="Masukkan Title" />
                                </Form.Group>

                                <Form.Group className="mb-3" controlId="formBasicPassword">
                                    <Form.Label>CONTENT</Form.Label>
                                    <Form.Control as="textarea" rows={3} value={content} onChange={(e) => setContent(e.target.value)} placeholder="Masukkan Content" />
                                </Form.Group>

                                <Button variant="primary" type="submit">
                                    UPDATE
                                </Button>
                            </Form>
                        </Card.Body>
                    </Card>
                </Col>
            </Row>
        </Container>
    );
}

export default EditPost;

Dari perubahan kode di atas, pertama kita melakukan import 2 hook dari React.js, yaitu useState dan useEffect.

//import hook useState dan useEffect from react
import { useState, useEffect } from 'react';

Kemudian kita juga import beberapa component dari React Bootstrap yang nanti akan digunakan di dalam halaman / component ini.

//import component Bootstrap React
import { Card, Container, Row, Col , Form, Button, Alert } from 'react-bootstrap';

Karena akan melakukan HTTP request ke dalam endpoint Rest API, maka kita juga harus melakukan import Axios.

//import axios
import axios from 'axios';

Terakhir, kita melakukan import 2 hook dari React Router Dom, yaitu useHistory dan useParams. Untuk hook useHistory akan kita gunakan untuk melakukan navigasi ke URL lain. Sedangkan untuk useParams akan digunakan untuk mengambil nilai parameter yang ada di URL browser.

//import hook history dan params dari react router dom
import { useHistory, useParams } from "react-router-dom";

Dan di dalam function component EditPost, pertama-tama kita melakukan definisi beberapa state terlebih dahulu.

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

//state validation
const [validation, setValidation] = useState({});

Setelah itu, kita membuat variable dengan nama history, yang mana isinya adalah hook useHistory dari React Router Dom.

//history
const history = useHistory();

Dan kita juga membuat variable dengan nama id dengan jenis objek, yang isinya diambil dari parameter URL di browser. Variable inilah yang nanti akan kita gunakan sebagai parameter untuk mencari data di server melalui Rest API.

//get ID from parameter URL
const { id } = useParams();

Setelah itu, kita menggunakan hook useEffect, hook ini akan dijalankan ketika component telah di mount. Dan di dalam hook ini, kita memanggil method yang bernama getPostById.

//hook useEffect
useEffect(() => {

   //panggil function "getPostById"
   getPostById();
        
}, []);

Di dalam method getPostById kita melakukan HTTP request ke dalam sebuah endpoint untuk mendapatkan detail data, yang nanti akan ditampilkan di halaman form edit.

//get data from server
const response = await axios.get(`http://localhost:3000/api/posts/${id}`);

Jika dari proses fetching data di atas berhasil dilakukan, maka kita akan masukkan data responsenya ke dalam variable yang bernama data.

//get response data
const data = await response.data.data

Setelah itu, kita akan assign atau masukkan data tersebut ke dalam state, yaitu title dan content.

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

Kemudian, kita membuat method yang bernama updatePost, method ini akan dijalankan ketika form dilakukan submit.

<Form onSubmit={ updatePost }>

	//...
	
</Form>

Dan di dalam method updatePost sendiri, kita akan mengirimkan data yang ada di dalam state ke dalam endpoint Rest API untuk proses update data menggunakan Axios dengan method PATCH.

//send data to server
await axios.patch(`http://localhost:3000/api/posts/update/${id}`, {
    title: title,
    content: content
})

Jika data berhasil di update di dalam server, maka kita akan melakukan redirect ke dalam URL /posts menggunakan hook useHistory.

//redirect
history.push('/posts');

Tapi, jika data gagal di update, maka kita akan assign atau masukkan error response validasi ke dalam state validation.

//assign validation on state
setValidation(error.response.data);

Dan untuk menampilkan validasi di dalam JSX, kurang lebih seperti berikut ini :

{
   validation.errors &&
     <Alert variant="danger">
        <ul class="mt-0 mb-0">
           { validation.errors.map((error, index) => (
               <li key={index}>{ `${error.param} : ${error.msg}` }</li>
           )) }
        </ul>
     </Alert>
}

Di atas, kita membuat sebuah kondisi, jika ada state validation.errors, maka kita akan melakukan perulangan di dalamnya. Dan data yang di looping tersebut adalah state validation itu sendiri.

Langkah 3 - Uji Coba Proses Edit dan Update Data

Sekarang, silahkan klik button EDIT di salah satu data post yang ada di halaman post index, jika berhasil maka kita akan diarahkan ke halaman edit form dengan data yang akan di update.

Silahkan sesuaikan data yang ada di dalam setiap inputan dan klik UPDATE, jika berhasil maka kita akan di arahkan ke dalam halaman post index dengan data yang berhasil di perbarui.

Sampai disini pembahasan bagaimana cara membuat proses edit dan juga update data di dalam React.js, di artikel selanjutnya kita akan belajar bagaimana cara membuat proses delete data di dalam React.js.

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