Skip to content

setValue

Update field value

setValue: (name: string, value: unknown, config?: Object) => void

This function allows you to dynamically set the value of a registered field and have the options to validate and update the form state. At the same time, it tries to avoid unnecessary rerender.

Props

NameTypeDescription
namestring
  • Target a single field by name.

  • When used with field array.

    • You can use methods such as replace or update for field array, however, they will cause the component to unmount and remount for the targeted field array.

      const { update } = useFieldArray({ name: 'array' });
      // unmount fields and remount with updated value
      update(0, { test: '1', test1: '2' })
      // will directly update input value
      setValue('array.0.test1', '1');
      setValue('array.0.test2', '2');
    • It will not create a new field when targeting a non-existing field.

      const { replace } = useFieldArray({ name: 'test' })
      // ❌ doesn't create new input
      setValue('test.101.data')
      // ✅ work on refresh entire field array
      replace([{data: 'test'}])
valueunknown

The value for the field. This argument is required and can not be undefined.

optionsshouldValidateboolean
  • Whether to compute if your input is valid or not (subscribed to errors).

  • Whether to compute if your entire form is valid or not (subscribed to isValid).

  • This option will update touchedFields at the specified field level not the entire form touched fields.
setValue('name', 'value', { shouldValidate: true })
shouldDirtyboolean
  • Whether to compute if your input is dirty or not against your defaultValues (subscribed to dirtyFields).

  • Whether to compute if your entire form is dirty or not against your defaultValues (subscribed to isDirty).

  • This option will update dirtyFields at the specified field level not the entire form dirty fields.
setValue('name', 'value', { shouldDirty: true })
shouldTouchboolean

Whether to set the input itself to be touched.

setValue('name', 'value', { shouldTouch: true })

Rules

  • Only the following conditions will trigger a re-render:

    • When an error is triggered or corrected by a value update

    • When setValue cause state update, such as dirty and touched.

  • It's recommended to target the field's name rather than make the second argument a nested object.

    setValue('yourDetails.firstName', 'value'); // ✅ performant
    setValue('yourDetails', { firstName: 'value' }); // less performant
    register('nestedValue', { value: { test: 'data' } }); // register a nested value input
    setValue('nestedValue.test', 'updatedData'); // ❌ failed to find the relevant field
    setValue('nestedValue', { test: 'updatedData' } ); // ✅ setValue find input and update
  • It's recommended to register the input's name before invoking setValue. To update the entire Field Array, make sure the useFieldArray hook is being executed first.

    Important: use replace from useFieldArray instead, update entire field array with setValue will be removed in the next major version.

    // you can update an entire Field Array,
    setValue('fieldArray', [{ test: '1' }, { test: '2' }]); // ✅
    // you can setValue to a unregistered input
    setValue('notRegisteredInput', 'value'); // ✅ prefer to be registered
    // the following will register a single input (without register invoked)
    setValue('resultSingleNestedField', { test: '1', test2: '2' }); // 🤔
    // with registered inputs, the setValue will update both inputs correctly.
    register('notRegisteredInput.test', '1')
    register('notRegisteredInput.test2', '2')
    setValue('notRegisteredInput', { test: '1', test2: '2' }); // ✅ sugar syntax to setValue twice

Examples

CodeSandbox JS
import { useForm } from "react-hook-form";
const App = () => {
const { register, setValue } = useForm();
return (
<form>
<input {...register("firstName")} />
<button type="button" onClick={() => setValue("firstName", "Bill")}>
setValue
</button>
<button
type="button"
onClick={() =>
setValue("lastName", "firstName", {
shouldValidate: true,
shouldDirty: true
})
}
>
setValue options
</button>
</form>
);
};
import * as React from "react";
import { useForm } from "react-hook-form";
type FormValues = {
a: string;
b: string;
c: string;
};
export default function App() {
const { watch, register, handleSubmit, setValue, formState } = useForm<
FormValues
>({
defaultValues: {
a: "",
b: "",
c: ""
}
});
const onSubmit = (data: FormValues) => console.log(data);
const [a, b] = watch(["a", "b"]);
React.useEffect(() => {
if (formState.touchedFields.a && formState.touchedFields.b && a && b) {
setValue("c", `${a} ${b}`);
}
}, [setValue, a, b, formState]);
return (
<form onSubmit={handleSubmit(onSubmit)}>
<input {...register("a")} placeholder="a" />
<input {...register("b")} placeholder="b" />
<input {...register("c")} placeholder="c" />
<input type="submit" />
<button
type="button"
onClick={() => {
setValue("a", "what", { shouldTouch: true });
setValue("b", "ever", { shouldTouch: true });
}}
>
trigger value
</button>
</form>
);
}

Video

The following video tutorial demonstrates setValue API in detail.

React Hook Form 中文网 - 粤ICP备13048890号