Skip to content
No description, website, or topics provided.
TypeScript JavaScript
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Type Name Latest commit message Commit time
Failed to load latest commit information.

React Hook useForm

useForm provides an interface around an object for use in forms.


npm install --save react-hook-use-form


The best useForm experiance comes when using Typescript.

Lets say you want to collect a users name and email for a newsletter form.

const NewsletterSignUp: React.FunctionComponent = () => {
  const {formBind, bind, onSubmit} = useForm({
    name: '',
    email: ''

  onSubmit((data) => {
    // `data` is the forms state when it was submitted

  return <form {...formBind()}>
    <input {...bind('name')} />
    <input {...bind('email')} />
    <input type="submit" value="Sign Up!" />

useForms output is an object with this structure:

property type value
bind (field: keyof T) => {value, onChange, name} Used to bind to a single field.
clear () => void Function that sets the form back to its initial value.
controlledInput (fieldName: keyof T) => ControlledInput Function that is used to create input fields (See Creating your own input).
data T The current state of the form.
formBind () => {onSumbit} Used to bind a forms submit action to useForm
onSubmit (handler: (data: T) => void) => void A function which takes a callback to be used when the form is submitted.
validate (field: keyof T, validator: (value: any) => boolean) => void A function that takes the field name and validation function as arguments.
valid (field?: keyof T) => boolean A function that checks the validity of one field or the whole form and returns a boolean value.
set (data: T) => void Function to set the data to a given value. Useful if you want to use one form to edit multiple entries.


Validating fields with useForm is easy. Going back to the earlier example, lets ensure that the email contains an @

const NewsletterSignUp: React.FunctionComponent = () => {
  const {valid, bind, formBind, validate} = useForm({
    name: '',
    email: ''

  validate('email', (value) => {
    return value.indexOf('@') > -1

  return <form {...formBind()}>
    <input {...bind('name')} style={{color: valid('name') ? '#000' : '#f00'}} />
    <input {...bind('email')} style={{color: valid('email') ? '#000' : '#f00'}} />
    <input type="submit" value="Subscribe" disabled={!valid()} />

Creating your own input

Sometimes simply using bind wont work as your not using and input and you want to have a custom input.

useForm returns a function of controlledInput which gives more control over a single field.

controlledInput returns the following:

property type value
field keyof T The current field
value T[field] The current value (connected to state)
update (newValue: T[field]) => void Change the value to the supplied value
valid () => boolean Returns a boolean value for the fields current validity
bind {value, onChange, name} The same as if you had called bind(field) directly from useForm
You can’t perform that action at this time.