1.0.11 • Published 5 months ago

react-bulk-form v1.0.11

Weekly downloads
-
License
ISC
Repository
github
Last release
5 months ago

react-bulk-form

A simple React library for managing form-related states in bulk.

Mental Model

It manages form field values and errors(i.e., validation results based on statically declared rules, for colocation) in bulk, and tracks form-level or field-level status.

How to implement the UX of forms based on these states is not a concern of this package, and therefore it minimizes secondary interfaces.

Install

$ npm install react-bulk-form

// or
$ yarn add react-bulk-form

Usage

Define Types

You should define the following two types to use this package.

/**
 * Define the type of the form values, which should be object type.
 * Each property should not be `undefined`.
 */
type PostFormValues = {
  title: string;
  content: string;
}

/**
 * Define the type representing the keys of the form validation rules to use.
 * If you don't use the validation rules, you don't need to define this type.
 * These keys don't need to match the field names, for better flexibility.
 */
type PostFormRuleKey = 'titleMinLengthCheck' | 'titleMaxLengthCheck' | 'contentMinLengthCheck';

useForm

import { useForm } from 'react-bulk-form';

const {
  /**
   * The values of the form.
   * The type of this object is the `PostFormValues` type.
   *
   * Example: `{ title: 'current title', content: 'current content' }`
   */
  values,

  /**
   * The errors of the form.
   * The type of each property name is `string` type, for considering the errors set by `setErrors`,
   * but it supports auto-completion for properties corresponding to the `PostFormRuleKey` type.
   *
   * Example: `{ titleMinLengthCheck: true }`
   */
  errors,

  /**
   * The fields whose values differ from their default values.
   * The type of each property name is the `keyof PostFormValues` type.
   *
   * Example: `{ title: true }`
   */
  dirtyFields,

  /**
   * The fields whose values have been changed. (Regardless of matching their default value.)
   * The type of each property name is the `keyof PostFormValues` type.
   *
   * Example: `{ title: true }`
   */
  touchedFields,

  /**
   * The flags representing the status of the form.
   */
  flags: {
    /**
     * Whether the values of the form are valid, based on the validation rules.
     * It equals to `Object.keys(errors).length === 0`.
     */
    isValid,

    /**
     * Whether the values of the form are different from the default values.
     * It equals to `Object.keys(dirtyFields).length > 0`.
     */
    isDirty,
  },

  /**
   * Set the values of the form. (It supports partial updates.)
   *
   * Example: `setValues({ title: 'new title' })`
   */
  setValues,

  /**
   * Set the errors of the form manually. (It supports partial updates.)
   * Those errors will be cleared when the values or the validation rules of the form are changed.
   * It is recommended to use this only when you need to perform heavy validation(e.g., async API calls)
   * for one-time validation(e.g., in submit handler). For other cases, don't use this.
   *
   * Example: `setErrors({ titleDuplicationCheck: true })`
   */
  setErrors,

  /**
   * Reset the values and the validation rules of the form to the default values, and clear the errors.
   */
  reset,

  /**
   * Commit the values of the form to the default values. (`flags.isDirty` will be set to `false`.)
   * In general, it is used right after submitting the form, for refreshing the default values.
   */
  commit,
} = useForm<PostFormValues, PostFormRuleKey>({
  /**
   * Set default values of the form.
   * The type of this object should be the `PostFormValues` type.
   */
  defaultValues: {
    title: '',
    content: '',
  },

  /**
   * Set validation rules for the form.
   * The type of each property name should be the `PostFormRuleKey` type.
   */
  rules: {
    titleMinLengthCheck: (values) => values.title.length >= 4,
    titleMaxLengthCheck: (values) => values.title.length <= 128,
    contentMinLengthCheck: (values) => values.content.length >= 16,
  },
});

FormProvider, useFormContext

import { useForm, FormProvider, useFormContext } from 'react-bulk-form';

// The parent component provides the form to the children.
function Parent() {
  const form = useForm<PostFormValues, PostFormRuleKey>({ ... });
  ...

  return (
    <FormProvider form={form}>
      <Child />
    </FormProvider>
  );
}

// The child component can use the form provided from `<FormProvider>`.
function Child() {
  const {
    values,
    errors,
    ...
  } = useFormContext<PostFormValues, PostFormRuleKey>();
  ...
}
1.0.11

5 months ago

1.0.10

5 months ago

1.0.9

5 months ago

1.0.8-10

5 months ago

1.0.8-9

5 months ago

1.0.8-8

5 months ago

1.0.8-7

5 months ago

1.0.8-6

5 months ago

1.0.8-5

5 months ago

1.0.8-4

5 months ago

1.0.8-3

5 months ago

1.0.8-2

5 months ago

1.0.8-1

5 months ago

1.0.8

5 months ago

1.0.7

5 months ago

1.0.6

5 months ago

1.0.5

5 months ago

1.0.4

5 months ago

1.0.3

5 months ago

1.0.2

5 months ago

1.0.1

5 months ago

1.0.0

5 months ago