Controller'srenderprop will pass downnameprophandleSubmittake a second callback for errors callback- new mode
onTouchedwill only trigger validation after inputs are touched
registerno longer comparerefdifference with React Native
- IE 11 version will be required to install
@babel/runtime-corejs3as dependency at your own project
- revert
getValueswill return default values before inputs registration
resolversupports both async and syncgetValueswill return default values before inputs registration
- export
ArrayFieldtype
- error message will support array of messages for specific type
- export type ValidateResult = Message | boolean | undefined;
+ export type ValidateResult = Message | Message[] | boolean | undefined;- Controller
onFocusworks with React Native - Controller stop producing
checkedprop by booleanvalue
- export
UseFormOptions,UseFieldArrayOptions,FieldError,FieldandModetype
- export
ValidationRulestype
- config for
shouldUnregisterwhich allow input to be persist even after unmount
useForm({
shouldUnregister: false, // unmount input state will be remained
});- auto focus with useFieldArray
append({}, (autoFocus = true));
prepend({}, (autoFocus = true));
insert({}, (autoFocus = true));- TS: NestedValue
import { useForm, NestedValue } from 'react-hook-form';
type FormValues = {
key1: string;
key2: number;
key3: NestedValue<{
key1: string;
key2: number;
}>;
key4: NestedValue<string[]>;
};
const { errors } = useForm<FormValues>();
errors?.key1?.message; // no type error
errors?.key2?.message; // no type error
errors?.key3?.message; // no type error
errors?.key4?.message; // no type erroruseWatch(new) subscribe to registered inputs.
<input name="test" ref={register} />;
function IsolateReRender() {
const { state } = useWatch({
name: 'test',
control,
defaultValue: 'default',
});
return <div>{state}</div>;
}getValues()support array of field names
getValues(['test', 'test1']); // { test: 'test', test1: 'test1' }useForm({ mode: 'all' })support all validation
-
rename
validationResolvertoresolver -
rename
validationContexttocontext -
rename
validateCriteriaModetocriteriaMode -
rename
triggerValidationtotrigger -
rename
clearErrortoclearErrors -
rename
FormContexttoFormProvider -
rename
dirtytoisDirty -
dirtyFieldschange type fromSettoObject -
Controller with render props API, and removed the following props:
- onChange
- onChangeName
- onBlur
- onBlurName
- valueName
-<Controller
- as={CustomInput}
- valueName="textValue"
- onChangeName="onTextChange"
- control={control}
- name="test"
-/>
+<Controller
+ render={({ onChange, onBlur, value }) => (
+ <CustomInput onTextChange={onChange} onBlur={onBlur} textValue={value} />
+ )}
+ control={control}
+ name="test"
+/>setErrorwill focus one error at a time and remove confusing set multiple errors, behavior change.- setError will persis an error if it's not part of the form, which requires manual remove with clearError
- setError error will be removed by validation rules, rules always take over errors
- setError('test', 'test', 'test')
+ setError('test', { type: 'test', message: 'bill'})setValuewill focus on input at a time
setValue('test', 'value', { shouldValidate: false, shouldDirty: false })- remove
validationSchemaand embrace validationresolver - remove
nestoption forwatch&getValues, so data return from both methods will be in FormValues shape.
-getValues({ nest: true }); // { test: { data: 'test' }}
-watch({ nest: true }); // { test: { data: 'test' }}
+getValues(); // { test: { data: 'test' }}
+watch(); // { test: { data: 'test' }}