react-hook-form v6.0.0 Release Notes

  • โž• Added

    • config for shouldUnregister which 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 error
    
    • useWatch (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

    ```typescript jsx getValues(['test', 'test1']); // { test: 'test', test1: 'test1' }

    
    - ๐Ÿ‘ `useForm({ mode: 'all' })` support all validation
    
    ### ๐Ÿ”„ Changed
    
    - ๐Ÿ“‡ rename `validationResolver` to `resolver`
    - ๐Ÿ“‡ rename `validationContext` to `context`
    - ๐Ÿ“‡ rename `validateCriteriaMode` to `criteriaMode`
    - ๐Ÿ“‡ rename `triggerValidation` to `trigger`
    - ๐Ÿ“‡ rename `clearError` to `clearErrors`
    - ๐Ÿ“‡ rename `FormContext` to `FormProvider`
    - ๐Ÿ“‡ rename `dirty` to `isDirty`
    - `dirtyFields` change type from `Set` to `Object`
    
    - ๐Ÿšš Controller with render props API, and removed the following props:
      - onChange
      - onChangeName
      - onBlur
      - onBlurName
      - valueName
    
    ```diff
    -<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"
    +/>
    
    • ๐Ÿšš setError will 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'})
    
    • setValue will focus on input at a time
    setValue('test', 'value', { shouldValidate: false, shouldDirty: false })
    

    โœ‚ Removed

    • โœ‚ remove validationSchema and embrace validation resolver
    • โœ‚ remove nest option for watch & getValues, so data return from both methods will be in FormValues shape.

    ```typescript diff -getValues({ nest: true }); // { test: { data: 'test' }} -watch({ nest: true }); // { test: { data: 'test' }} +getValues(); // { test: { data: 'test' }} +watch(); // { test: { data: 'test' }}