FormApi

The FormApi object is the main way to interact with RVF. It's returned by useForm and can be scoped to a specific part of the form.

Prop getters

getFormProps

You should call this in every form you have and pass the result to your form element.

const form = useForm({
  // ...
});

return (
  <form {...form.getFormProps()}>
    <YourFormElements />
  </form>
);

getInputProps

Returns props that can be spread onto native form controls or thin wrappers around them. It's generally recommended to use this with native form controls. And pass any other props through this helper.

It's important that the component you spread the props into accepts the ref prop. This allows RVF to set the value of the field when setValue is called, and is used to focus the field when it has an error.

<input {...form.getInputProps("myField", { type: "number" })} />

getControlProps

Returns props that can be spread into controlled components to use as a field. It's important to pass the provided ref to a focusable HTML element. This allows the field to be focused when it has an error and also disables RVF's default behavior of automatically listening to changes in the field.

getHiddenInputProps

Returns props that can be spread into a native form control to use as a hidden field. This is useful in combination with getControlProps.

Fields and arrays

field

Returns a FieldApi object for the specified field. Can be called without a field name to get an field api currently in-scope form data.

array

Returns a FieldArrayApi object for the specified field. Can be called without a field name to get an array api currently in-scope form data.

State accessors

These functions can all be used to access the current state of the form during the render phase.

name

Returns the name of the specified field. Can be called without a field name to get the name of the field currently in-scope form data.

This can be useful if you want a typesafe way of getting the name of a field, especially if you're scoping.

value

Can be called with the name of a field to get the value of that field. If the FormApi is scoped to a specific part of the form, the field name is relative to the scope.

Can also be called with no arguments to get the entire form data. If the FormApi is scoped to a specific part of the form, this will be limited to the scope.

error

Returns the error message for the specified field, if there is one. If the FormApi is scoped to a specific part of the form, the field name is relative to the scope.

Can also be called with no arguments to get the error for the field currently in scope.

RVF takes the opinion that errors that won't be visible to a user aren't made available through this API. So you don't need to do any additional logic to determine if an error should be displayed to the user beyond checking if there's an error.

defaultValue

Returns the default value for the specified field. If the FormApi is scoped to a specific part of the form, the field name is relative to the scope.

Can also be called with no arguments to get the default value for the currently in-scope form data.

touched

Can be called with the name of a field to get whether or not that field has been touched. If the name of the field is omitted, it will return whether or not the currently scoped field has been touched.

A field has been "touched" after the user has interacted with it and moved on to another field in the form.

dirty

Can be called with the name of a field to get whether or not that field has been changed. If the name of the field is omitted, it will return whether or not the currently scoped field has been dirty.

A field "dirty" when it no longer matches the default value. If the user changes the value back to the default, the field will no longer be dirty.

formOptions

An object that exposes a couple of the options you passed to useForm.

  • action
  • formId

If you didn't pass a formId, it will have a default value.

formState

Exposes some form-level state. The data in here is always based on the root-level form, even if the FormApi is scoped to a specific part of the form.

Submit status

These three props tell you about the current state of submission:

  • isSubmitting
    • Whether or not the form is currently submitting.
  • hasBeenSubmitted
    • Whether or not a submit has been attempted.
  • submitStatus
    • "idle" | "submitting" | "error" | "success"

Root-level valid/dirty/touched

These tell you if any field in the form is valid, dirty, or touched.

  • isValid
  • isDirty
  • isTouched

All valid/dirty/touched data

Contains all the valid/dirty/touched data for every field in the form.

  • touchedFields
  • dirtyFields
  • fieldErrors

Transient state accessors

transient

The transient object contains many of the same state accessors mentioned above, except that these will not trigger rerenders and will always return the latest state. This is useful for things like event handlers.

the included state accessors are:

  • value
  • defaultValue
  • touched
  • dirty
  • error
  • formState

Example:

<button
  type="button"
  // Always logs the latest value of `myField` without causing rerenders
  onClick={() => console.log(form.transient.value("myField"))}
>
  Log value
</button>

State setters

setValue

Sets the value of the field with the specified name. This works for both controlled and uncontrolled fields. For uncontrolled fields, this will manually set the value of the form control using the ref returned by getInputProps.

Can also be called without a field name, to set the value of the entire form. If the FormApi is scoped to a specific part of the form, this will be limited to the scope.

clearError

Clears the error message for the specified field. Can be called without a field name to clear the error message for the field in scope.

setTouched

Manually set the touched state of the specified field. Can be called without a field name to set the touched state of the field in scope.

setDirty

Manually set the dirty state of the specified field. Can be called without a field name to set the dirty state of the field in scope.

focus

Focus the field with the specified name. This only works if the ref provided by getInputProps or getControlProp was passed to a focusable element.

validate

Manually validates the form. You usually don't need to do this.

resetForm

Resets the form to its initial state. All fields will be reset to their initial values. All touched, dirty, and validation errors will be reset. Optionally, you can provide new initial values to reset.

This will work on the root-level form, even if the FormApi is scoped to a specific part of the form.

resetField

Resets the field with the specified name to its initial value. This also resets any touched, dirty, or validation errors for the field. This works for both controlled and uncontrolled fields. For uncontrolled fields, this will manually set the value of the form control using the ref returned by field.

scope

Scopes the FormApi to a specific part of the form. See the docs on scoping for more details.

renderFormIdInput

Renders a hidden input that sets passes the form id to your server. This is only useful if you're supporting users who don't have JS enabled and you're returning validation errors from your server.

subscribe

Helpers to subscribe to changes transiently (without causing re-renders). These should be used in an effect.

value

Subscribes to any change in the values of the form. Can optionally pass the name of a field to subscribe to that specific field. Returns a function that can be called to unsubscribe.

Example:

useEffect(
  () =>
    form.subscribe.value((formData) => {
      console.log(formData);
    }),
  [],
);

useEffect(
  () =>
    form.subscribe.value("myField", (myFieldData) => {
      console.log(myFieldData);
    }),
  [],
);