View on GitHub

React Hook Form Plus

(RHF+)

Readonly field validation skip

Purpose

The readonly validation skip feature allows you to opt-in to excluding fields with the readOnly HTML attribute from form validation, similar to how disabled fields are handled. This provides a better user experience by preventing validation errors on fields that users cannot modify.

Benefits

API Changes

Property updates

export type UseFormProps<...> = Partial<{
    // ... existing properties
    shouldSkipReadOnlyValidation?: boolean; // New property
}>;

Description

When shouldSkipReadOnlyValidation is set to true, fields with the HTML readOnly attribute are excluded from all validation rules while maintaining their form integration for value updates and submission data.

Behavior

When shouldSkipReadOnlyValidation: true is set, readonly fields with the HTML readOnly attribute are excluded from field validation rules. However, readonly fields still:

Examples

Basic readonly field

import { useForm } from '@bombillazo/rhf-plus';

function App() {
  const {
    register,
    handleSubmit,
    formState: { errors },
  } = useForm({
    shouldSkipReadOnlyValidation: true, // Enable readonly validation skip
    defaultValues: {
      readonlyField: 'preset-value',
      editableField: '',
    },
  });

  const onSubmit = (data) => {
    console.log(data); // Includes both readonly and editable fields
  };

  return (
    <form onSubmit={handleSubmit(onSubmit)}>
      {/* This field will not validate even though it has required rule */}
      <input
        {...register('readonlyField', { required: 'This field is required' })}
        readOnly
      />
      {errors.readonlyField && <span>{errors.readonlyField.message}</span>}

      {/* This field will validate normally */}
      <input
        {...register('editableField', { required: 'This field is required' })}
      />
      {errors.editableField && <span>{errors.editableField.message}</span>}

      <button type="submit">Submit</button>
    </form>
  );
}

Coexistence with disabled fields

import { useForm } from '@bombillazo/rhf-plus';

function App() {
  const {
    register,
    handleSubmit,
    formState: { errors },
  } = useForm({
    shouldSkipReadOnlyValidation: true, // Enable readonly validation skip
    defaultValues: {
      readonlyField: '',
      disabledField: '',
      normalField: '',
    },
  });

  return (
    <form onSubmit={handleSubmit(console.log)}>
      {/* Readonly field - validation skipped */}
      <input
        {...register('readonlyField', { required: 'Required' })}
        readOnly
      />

      {/* Disabled field - validation skipped */}
      <input
        {...register('disabledField', { required: 'Required' })}
        disabled
      />

      {/* Normal field - validation applies */}
      <input {...register('normalField', { required: 'Required' })} />
      {errors.normalField && <span>{errors.normalField.message}</span>}

      <button type="submit">Submit</button>
    </form>
  );
}

Limitations

This feature has no significant limitations:

Backward compatibility

This feature is fully backward compatible: