# useForm > Controlled form state with one change handler. - Category: State - Package: `hookli` (install with `npm i hookli`) - Docs: https://hookli.vercel.app/docs/use-form ## Signature ```ts useForm(initialState: T): { values: T; handleChange: (e: ChangeEvent) => void; resetForm: () => void } ``` ## Parameters - `initialState`: `T` — Initial field values. Keys must match the name attribute of each input. ## Returns - `values`: `T` — The current form values. - `handleChange`: `(event: ChangeEvent) => void` — One change handler for every named input, textarea and select. - `resetForm`: `() => void` — Restores initialState. ## Usage ```tsx import { useForm } from "hookli"; export function Demo() { const { values, handleChange, resetForm } = useForm({ name: "", email: "" }); return (
e.preventDefault()}>
); } ``` ## Source `src/hooks/useForm.hook.ts` ```ts import { ChangeEvent, useState } from "react"; interface UseFormValues { [key: string]: string | number | boolean; } export const useForm = (initialState: T) => { const [values, setValues] = useState(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 }; }; ```