Tutorial Express.js dan React.js #6 : Insert Data di React.js


Tutorial Express.js dan React.js #6 : Insert Data di React.js

Halo teman-teman semuanya, di artikel sebelumnya kita telah belajar bagaimana cara menampilkan data di dalam React.js dan datanya di ambil dari Rest API yang dibuat di dalam Express.js. Dan di artikel kali ini kita semua akan belajar bagaimana cara membuat proses insert data di dalam React.js

Langkah 1 - Membuat Form dan Proses Insert Data

Sekarang kita akan mengubah isi dari halaman / component yang sudah pernah kita buat sebelumnya. Silahkan buka file src/pages/posts/Create.js, kemudian ubah semua kode-nya menjadi seperti berikut ini :

//import hook useState from react
import { useState } 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 dari react router dom
import { useHistory } from "react-router-dom";

function CreatePost() {

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

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

    //history
    const history = useHistory();

    //method "storePost"
    const storePost = async (e) => {
        e.preventDefault();
        
        //send data to server
        await axios.post('http://localhost:3000/api/posts/store', {
            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={ storePost }>
                                <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">
                                    SIMPAN
                                </Button>
                            </Form>
                        </Card.Body>
                    </Card>
                </Col>
            </Row>
        </Container>
    );
}

export default CreatePost;

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

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

Kemudian kita import beberapa component dari React Bootstrap.

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

Dan karena akan melakukan sending data ke server menggunakan Rest API, maka kita butuh import library Axios.

//import axios
import axios from 'axios';

Karena setelah proses insert data berhasil akan di redirect ke halaman utama, maka kita akan melakukan import hook useHistory dari React Router Dom.

//import hook history dari react router dom
import { useHistory } from "react-router-dom";

Dana di dalam function component CreatePost, pertama-tama kita membuat beberapa state terlebih dahulu.

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

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

Di atas, kita membuat 3 state baru, yaitu title, content dan validation. Untuk state title dan content akan digunakan untuk menyimpan data yang diketik di dalam input form. Dan sedangkan untuk state validation akan digunakan untuk menyimpan error response dari Rest API.

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

//history
const history = useHistory();

Kemudian kita membuat method yang bernama storePost, method ini akan dijalankan ketika form di submit.

<Form onSubmit={ storePost }>

	//...
	
</Form>
//method "storePost"
const storePost = async (e) => {
	
	//...
	
}

Di dalam method storePost, pertama kita atur dengan event preventDefault, tujuannya agar form saat di submit tidak melakukan reload page.

e.preventDefault();

Setelah itu, di dalamnya kita melakukan sending data menggunakan Axios dengan method POST ke dalam endpoint http://localhost:3000/api/posts/store dengan mengirimkan 2 parameter data, yaitu title dan content. Dimana data-nya di ambil dari state.

//send data to server
await axios.post('http://localhost:3000/api/posts/store', {
   title: title,
   content: content
})

Jika proses insert data berhasil dilakukan, maka kita akan melakukan redirect ke dalam URL /posts.

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

Tapi, jika data gagal di insert, maka kita akan melakukan assign error response ke dalam state yang bernama validation.

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

Dan, untuk menampilkan error 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.

Dan di dalam input form, untuk mengirimkan value ke dalam state, kita menggunakan onChange, kurang lebih seperti berikut ini :

<Form.Control type="text" value={title} onChange={(e) => setTitle(e.target.value)} placeholder="Masukkan Title" />

<Form.Control as="textarea" rows={3} value={content} onChange={(e) => setContent(e.target.value)} placeholder="Masukkan Content" />

Di atas, jika terdapat perubahan di dalam input atau onChange, maka akan menjalankan state handler dan melakukan assign value ke dalam state.

Langkah 2 - Uji Coba Proses Insert Data

Sekarang kita akan lakukan uji coba untuk proses insert data. Silahkan klik button TAMBAH POST yang berada di halaman post index atau bisa ke URL berikut ini http://localhost:3001/posts/create, jika berhasil maka akan menampilkan halaman seperti berikut ini :

Silahkan klik button SIMPAN tanpa memasukkan data apapun, maka kita akan mendapatkan error validasi yang di dapatkan dari Rest API Express.js.

Dan jika kita coba isi data title dan content dan klik button SIMPAN lagi, maka kita akan diarahkan ke halaman post index dengan data yang telah di insert.

Sampai disini pembahasan bagaimana cara melakukan proses insert data di dalam React.js, di artikel selanjutnya kita akan belajar bagaimana cara membuat proses edit dan update data di dalam React.js dengan Rest API yang dibuat di dalam Express.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