Last active
January 25, 2024 06:58
-
-
Save sebasmrl/fbd5bbcc352366ac4dc4d80c977a4ef5 to your computer and use it in GitHub Desktop.
Custom Hook for manage forms in React
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import { ChangeEvent, FormEvent, useState } from "react"; | |
/** | |
* | |
* @param initialState | |
* @returns '{ formData, handleChange, handleSubmit }' | |
* @author 'Sebastian Morales' | |
* @description 'useForm es un hook para trabajar con formularios sin importar el numero de entradas, | |
sin embargo, sus valores "key" deben coincidir con la propiedad "name" de cada elemento input HTML' | |
*/ | |
export const useForm = <T>(initialState: T) => { | |
const [formData, setFormData] = useState(initialState); | |
const handleChange = ( e: (ChangeEvent<HTMLInputElement> ) )=>{ | |
const { name, value } = e.target; | |
setFormData({ | |
...formData, | |
[name]: value, | |
}); | |
} | |
const handleSelectChange = ( e: (ChangeEvent<HTMLSelectElement> ) )=>{ | |
const { name, value } = e.target; | |
setFormData({ | |
...formData, | |
[name]: value, | |
}); | |
} | |
const handleSubmit = async( e:FormEvent<HTMLFormElement>, | |
handleCallback: ()=> Promise<void> )=>{ | |
e.preventDefault(); | |
e.stopPropagation(); | |
await handleCallback(); | |
} | |
const reinitalizeForm = ()=>{ | |
setFormData(initialState); | |
} | |
return { | |
formData, | |
handleChange, | |
handleSelectChange, | |
handleSubmit, | |
reinitalizeForm | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment