Skip to content

1. Form Handle

Pada materi ini kita akan mempelajari basic dari bagaimana membuat form pada reactjs. Setiap aplikasi pasti memiliki form yang digunakan untuk menyimpan data dan mengupdate data. Hal ini sudah umum dan pasti kita semua pernah mengguankan form yang ada pada aplikasi.

component/select.tsx
import clsx from "clsx";
import { ChangeEvent } from "react";

type Variant = "solid" | "outline";
type ColorSchema = "blue" | "red" | "green";

interface ButtonProps {
  options: { value: string | number; label: string }[];
  name: string;
  isError?: boolean;
  messageError?: string;
  id: string;
  value: string | number | null;
  onChange: (e: ChangeEvent<HTMLSelectElement>) => void;
}

const Select: React.FC<
  ButtonProps & React.SelectHTMLAttributes<HTMLSelectElement>
> = ({
  options,
  value,
  name,
  id,
  messageError = "wajib di isi",
  isError = false,
  ...props
}) => {
  return (
    <section>
      <select
        value={value}
        name={name}
        id={id}
        className={clsx(`w-full h-8 border rounded px-2`, {
          "border-red-500 border-2": isError,
          "border-gray-700": !isError,
        })}
        {...props}
      >
        {!!value === false && <option>Pilih</option>}
        {options?.map((option, index) => (
          <option key={index} value={option.value}>
            {option.label}
          </option>
        ))}
      </select>
      {isError ? (
        <p className="text-red-500 font-bold">{messageError}</p>
      ) : (
        <></>
      )}
    </section>
  );
};


export default Select;
app/page.tsx
"use client"; // gunakan use client karena ada onChange pda komponen
import { ChangeEvent, useState } from "react";
import BelajarState from "./module/belajarState";
import Card from "./latihan/Card";
import Button from "./component/Button";
import InputText from "./component/InputText";
import Select from "./component/Select";
import Label from "./component/Label";

interface Value {
  title: string;
  author: string;
  year: number | string;
}

const Home = () => {
  const [values, setValues] = useState<Value>({
    title: "",
    author: "",
    year: "",
  });

  const handleChange = (event: ChangeEvent<any>) => {
    setValues((prevValues) => {
      return {
        ...prevValues,
        [event.target.name]: event.target.value,
      };
    });
  };

  const handleSubmit = (e: ChangeEvent<any>) => {
    e.preventDefault();

    alert(JSON.stringify(values));
  };

  return (
    <main className="space-y-5">
      {JSON.stringify(values)}
      <h1 className="text-red-500 font-bold">Latihan Form</h1>
      <form onSubmit={handleSubmit} className="space-y-3">
        <section>
          <Label htmlFor="author" isRequired title="Penulis" />
          <InputText
            placeholder="Nama Penulis buku"
            id="author"
            name="author"
            value={values.author}
            onChange={handleChange}
          />
        </section>

        <section>
          <Label htmlFor="title" isRequired title="Judul Buku" />
          <InputText
            placeholder="Nama Judul buku"
            id="title"
            name="title"
            value={values.title}
            onChange={handleChange}
          />
        </section>
        <section>
          <Label htmlFor="year" title="Tahun Terbit" />
          <Select
            value={values.year}
            name="year"
            onChange={handleChange}
            isError
            id="year"
            options={[
              {
                value: 2020,
                label: "2020",
              },
              {
                value: 2021,
                label: "2021",
              },
              {
                value: 2022,
                label: "2022",
              },
              {
                value: 2023,
                label: "2023",
              },
            ]}
          />
        </section>
        <section>
          <Button type="submit" colorSchema="blue" title="Simpan" />
        </section>
      </form>
    </main>
  );
};

export default Home;

Alt text