Pada part sebelumnya kita sudah membahas bagaimana redux bekerja dan sudah menyelesaikan cara mendapatkan data/GET Data dari sebuah API.
kali ini kita akan mempelajari bagaimana melakukan CREATE dan Update sebuah data dengan menggunakan Redux Toolkit Query. Langkah yang perlu kita lakukan adalah membuat sebuah react component yang berisi sebuah form
- Form Components
Buatlah sebuah component
import React, { useState } from "react";
import {useNavigate } from "react-router-dom";
const FormContact = () => {
return(
<>
<div>
<input type="text" value="" onchange={} />
<input type="text" value="" onchange={} />
<input type="text" value="" onchange={} />
</div>
</>
)
}
export const FormContact;
2. Membuat state untuk menampung hasil inputan pada form
import React, { useState } from "react";
import {useNavigate } from "react-router-dom";
const FormContact = () => {
//declare semua state di sini
const [name, setName] = useState("")
const [address, setAddress] = useState("")
const [email, setEmail] = useState("")
return(
<>
<div>
<input type="text" value={name} onchange={} />
<input type="text" value={address} onchange={} />
<input type="text" value={email} onchange={} />
</div>
<div>
<button onCLick={}>Submit</button>
</div>
</>
)
}
export const FormContact;
3. Membuat fungsi untuk melakukan handling saat state berubah
import React, { useState } from "react";
import {useNavigate } from "react-router-dom";
const FormContact = () => {
//declare semua state di sini
const [name, setName] = useState("")
const [address, setAddress] = useState("")
const [email, setEmail] = useState("")
//function handler
const fnInsertName = (event) => {
setName(event.target.value)
}
const fnInsertEmail = (event) => {
setEmail(event.target.value)
}
const fnInsertAddress = (event) => {
setAddress(event.target.value)
}
return(
<>
<div>
<input type="text" value={name} onchange={fnInsertName} />
<input type="text" value={address} onchange={fnInsertEmail} />
<input type="text" value={email} onchange={fnInsertAddress} />
</div>
<div>
<button onCLick={}>Submit</button>
</div>
</>
)
}
export const FormContact;
pada fungsi tersebut melakukan handle pada saat value berubah, maka setter (setName, setEmail) akan melakukan update terhadap state sesuai value terbaru
4. Rtk-query Post Data
untuk melakukan submit form kita perlu menambahkan fungsi pada API Builder yang ada di file redux yang sudah kita buat sebelumnya
import { createSlice } from "@reduxjs/toolkit";
import { createApi, fetchBaseQuery } from '@reduxjs/toolkit/query/react';
//API Requirements Variable
const token = 'yourtoken'
const appId = 'yuorappId'
//Slice/Reducer
export const EmployeeApi = createApi({
reducerPath: "EmployeeApi",
baseQuery: fetchBaseQuery({
baseUrl: 'https://io.etter.cloud/v4/',
}),
//API Builder
endpoints: (builder) => ({
//Tuliskan semua fungsi di sini
//1. Get Contacts
employee: builder.query({
query: () => `select_all/token/${token}/project/myreactproject/collection/employee/appid/${appId}/employee`,
}),
//2. Create Contact
addEmployee: builder.mutation({
query:({insertContactData}) => ({
url: 'https://io.etter.cloud/v4/insert/employee',
method: 'POST',
body: insertContactData,
}),
})
})
});
//Custom Hooks
export const {
//cara penulisan custom hooks -> use,nama endpoints (camelCase) + tipe Query/Mutation nya
useEmployeeQuery,
useAddEmployeeMutation
} = EmployeeApi
dapat kita lihat pada file rtk-query tersebut terdapat 2 jenis builder yaitu “query” dan “mutation”. Lalu bagaimana perbedaan penggunaannya ? tipe “query” dapat kita gunakan untuk melakukan aksi GET data/read data dari API, dan apabila kita melakukan perubahan terhadap data maka kita menggunakan tipe “mutation” seperti padaa saat post dan update data.
Setelah selesai membuat fungsi untuk melakukan post data pada file rtk-query, selanjutnya adalah membuat custom hooks “useAddEmployeeMutation” kemudian import hooks tersebut ke dalam component.
Import Custom Hooks (useaAddEmployeeMutation) pada Component lalu gunakan hooks tersebut
import React, { useState } from "react";
import {useNavigate } from "react-router-dom";
//import custom hooks nya
import { useAddNewEmployeeMutation } from "../services/rtkQueryEmployee";
const FormContact = () => {
//gunakan custom hooks
const [dispatchAddContactMutation] = useAddNewEmployeeMutation()
//declare semua state di sini
const [name, setName] = useState("")
const [address, setAddress] = useState("")
const [email, setEmail] = useState("")
//function handler
const fnInsertName = (event) => {
setName(event.target.value)
}
const fnInsertEmail = (event) => {
setEmail(event.target.value)
}
const fnInsertAddress = (event) => {
setAddress(event.target.value)
}
return(
<>
<div>
<input type="text" value={name} onchange={fnInsertName} />
<input type="text" value={address} onchange={fnInsertEmail} />
<input type="text" value={email} onchange={fnInsertAddress} />
</div>
<div>
<button onCLick={}>Submit</button>
</div>
</>
)
}
export const FormContact;
5. Fungsi Submit Form
setelah melakukan import custom hooks, kita akan membuat function yang akan melakukan handling saat button submit ditekan. pada fungsi tersebut kita akan menggabungkan seluruh state yang ada dan menampung state tersebut dengan variabel “insertContactData”
import React, { useState } from "react";
import {useNavigate } from "react-router-dom";
//import custom hooks nya
import { useAddNewEmployeeMutation } from "../services/rtkQueryEmployee";
const FormContact = () => {
//gunakan custom hooks
const [dispatchAddContactMutation] = useAddNewEmployeeMutation()
//declare semua state di sini
const [name, setName] = useState("")
const [address, setAddress] = useState("")
const [email, setEmail] = useState("")
//function handler
const fnInsertName = (event) => {
setName(event.target.value)
}
const fnInsertEmail = (event) => {
setEmail(event.target.value)
}
const fnInsertAddress = (event) => {
setAddress(event.target.value)
}
//fungsi submit form
const fnInsertContact = () => {
const insertContactData = {
"name": name,
"address": address,
"email": email,
}
//dispatch hooks
dispatchAddContactMutation({insertContactData})
}
return(
<>
<div>
<input type="text" value={name} onchange={fnInsertName} />
<input type="text" value={address} onchange={fnInsertEmail} />
<input type="text" value={email} onchange={fnInsertAddress} />
</div>
<div>
<button onCLick={fnInsertContact}>Submit</button>
</div>
</>
)
}
export const FormContact;
pada bagian //dispatch hook, kita memanggil “dispatchAddContactMutation” dan memasukkan data yang baru ke dalamnya. Pada langkah ini kita sudah berhasil melakukan create data baru.
Update Contact
untuk melakukan update contact cara yang dilakukan hampir sama seperti melakukan create contact, yaitu kita akan menambahkan fungsi baru pada api builder, membuat custom hooks dan memanggil hooks tersebut ke dalam komponen.
agar lebih jelasnya dapat kita simak pada source code berikut:
- Pada file redux tambahkan fungsi update data
import { createSlice } from "@reduxjs/toolkit";
import { createApi, fetchBaseQuery } from '@reduxjs/toolkit/query/react';
//API Requirements Variable
const token = 'yourtoken'
const appId = 'yuorappId'
//Slice/Reducer
export const EmployeeApi = createApi({
reducerPath: "EmployeeApi",
baseQuery: fetchBaseQuery({
baseUrl: 'https://io.etter.cloud/v4/',
}),
//API Builder
endpoints: (builder) => ({
//Tuliskan semua fungsi di sini
//1. Get Contacts
employee: builder.query({
query: () => `select_all/token/${token}/project/myreactproject/collection/employee/appid/${appId}/employee`,
}),
//2. Create Contact
addEmployee: builder.mutation({
query:({insertContactData}) => ({
url: 'https://io.etter.cloud/v4/insert/employee',
method: 'POST',
body: insertContactData,
}),
//3. Update Contact
updateEmployee: builder.mutation({
query: ({ UpdateData }) => ({
url: 'https://io.etter.cloud/v4/update_id/employee',
method: 'POST',
body: UpdateData,
})
}),
})
})
});
//Custom Hooks
export const {
//cara penulisan custom hooks -> use,nama endpoints (camelCase) + tipe Query/Mutation nya
useEmployeeQuery,
useAddEmployeeMutation,
useUpdateEmployeeMutation,
} = EmployeeApi
2. Buat Component baru dengan nama updateContact.jsx
kita dapat melakukan copy-paste dari component form yang sudah kita buat dan mengganti nama component dan fungsi submitnya sehingga terlihat seperti berikut
import React, { useState } from "react";
import {useNavigate } from "react-router-dom";
//import custom hooks nya
import { useUpdateEmployeeMutation } from "../services/rtkQueryEmployee";
const UpdateContact = () => {
//gunakan custom hooks
const [dispatchUpdateContactMutation] = useUpdateEmployeeMutation()
//declare semua state di sini
const [name, setName] = useState("")
const [address, setAddress] = useState("")
const [email, setEmail] = useState("")
//function handler
const fnInsertName = (event) => {
setName(event.target.value)
}
const fnInsertEmail = (event) => {
setEmail(event.target.value)
}
const fnInsertAddress = (event) => {
setAddress(event.target.value)
}
//fungsi submit form
const fnUpdateContact = () => {
const insertContactData = {
"name": name,
"address": address,
"email": email,
}
//dispatch hooks
dispatchUpdateContactMutation({insertContactData})
}
return(
<>
<div>
<input type="text" value={name} onchange={fnInsertName} />
<input type="text" value={address} onchange={fnInsertEmail} />
<input type="text" value={email} onchange={fnInsertAddress} />
</div>
<div>
<button onCLick={fnUpdateContact}>Submit</button>
</div>
</>
)
}
export const FormContact;
Pada tahap ini kita sudah berhasil untuk melakukan update data. untuk melakukan delete data dan search data akan kita bahas pada part selanjutnya…