State

useForm

Controlled form state with one change handler.

Demo

{
  "name": "",
  "email": ""
}

Usage

use-form.tsxtsx
import { useForm } from "hookli";

export function Demo() {
  const { values, handleChange, resetForm } = useForm({ name: "", email: "" });

  return (
    <form onSubmit={(e) => e.preventDefault()}>
      <input name="name" value={values.name} onChange={handleChange} />
      <input name="email" type="email" value={values.email} onChange={handleChange} />
      <button type="button" onClick={resetForm}>Reset</button>
    </form>
  );
}

API

useForm.d.tsts
useForm<T>(initialState: T): { values: T; handleChange: (e: ChangeEvent) => void; resetForm: () => void }

Parameters

NameTypeDefaultDescription
initialStateTInitial field values. Keys must match the name attribute of each input.

Returns

NameTypeDescription
valuesTThe current form values.
handleChange(event: ChangeEvent) => voidOne change handler for every named input, textarea and select.
resetForm() => voidRestores initialState.

Hook

The implementation, straight from hookli. Copy it, or install the package.

src/hooks/useForm.hook.tstsx
import { ChangeEvent, useState } from "react";

interface UseFormValues {
  [key: string]: string | number | boolean;
}

export const useForm = <T extends UseFormValues>(initialState: T) => {
  const [values, setValues] = useState<T>(initialState);

  const handleChange = (
    event: ChangeEvent<
      HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement
    >,
  ) => {
    const { name, value } = event.target;
    setValues((prevValues) => ({ ...prevValues, [name]: value }));
  };

  const resetForm = () => {
    setValues(initialState);
  };

  return { values, handleChange, resetForm };
};

View source on GitHub

Related hooks