npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@bunstack/hook-form-react

v1.0.77

Published

a custom hook form for react

Downloads

169

Readme

Hook Form React

This project provides a set of custom hooks to simplify the use of forms in React applications.

This project is not production ready and will contain bugs. If you find one please open an issue.

Installation

To install the project, you can use npm:

yarn add @bunstack/hook-form-react
                or 
npm install @bunstack/hook-form-react
                or
bun add @bunstack/hook-form-react

This is an experimental hook form to simplify the use of forms in react.

Usage

FormWrapper

The FormWrapper component is a context provider for form data. It provides a way to manage form data and exposes methods to get and update form data. It uses the React Context API to allow child components to access and manipulate the form data without prop drilling.

Here's an example of how you could import and use this component:

import FormWrapper from '@bunstack/hook-form-react';

const MyForm = () => {
  // Do not add any hooks here they will not work
  return (
    <FormWrapper defaultValues={{ firstName: '', lastName: '' }}>
      {/* Your form fields go here */}
    </FormWrapper>
  );
};

export default MyForm;

useForm

useForm is a custom React hook that helps manage form state and validation. It takes an object with the initial form values, a submission function, and a schema for validation. It returns an object with methods to reset the form, handle form submission, validate the form, and access any validation errors.

Here's an example of how you might import and use this hook:

import { useForm } from '@bunstack/hook-form-react';

type FormData = {
  name: string;
  age: number;
};

const MyFormComponent = () => {
  const { reset, handleSubmit, validate, errors } = useForm<FormData>({
    defaultValues: { name: '', age: 0 },
    onSubmit: (data) => {
      // This will only fire if there are no errors when using schema
      console.log('Form submitted with data:', data);
    },
    schema: {
      name: { validate: (value) => typeof value === 'string', errorMessage: 'Name must be a string' },
      age: { validate: (value) => typeof value === 'number', errorMessage: 'Age must be a number' },
    },
  });

  return (
    <form onSubmit={handleSubmit}>
      {/* form fields here */}
    </form>
  );
};

useField

The useField hook is a custom hook that helps manage form field states in a React application. It provides functionalities to get and set the value of a form field, as well as to reset and clean the field.

Here's an example of how you can import and use this hook:

import useField from '@bunstack/hook-form-react';

const InputComponent: FC = () => {
  const { value, onChange } = useField<string>({ name: 'name' });

  return (
      <input
        id="name"
        type="text"
        value={value || ''}
        onChange={onChange}
      />
  );
};

export default InputComponent;

Nested Example

import useField from '@bunstack/hook-form-react';

const NameInputComponent: FC = () => {
  const { value: firstName, onChange: setFirstName } = useField<string>({ name: 'name.first' });
  const { value: lastName, onChange: setLastName } = useField<string>({ name: 'name.last' });

  return (
    <>
      <input
        id="firstName"
        type="text"
        value={firstName || ''}
        onChange={setFirstName}
      />
      <input
        id="lastName"
        type="text"
        value={lastName || ''}
        onChange={setLastName}
      />
    </>
  );
};

export default NameInputComponent;

In this example, we're using the useField hook twice, once for each part of the name. The name property of the options object passed to useField is a string that uses dot notation to specify the path to the field in the form data.

The first useField call is for the first name, so we pass { name: 'name.first' }. This means that the form data is expected to be an object with a name property, which is itself an object with a first property.

The second useField call is for the last name, so we pass { name: 'name.last' }. This means that the form data is expected to be an object with a name property, which is itself an object with a last property.

The value and onChange properties returned by useField are then used to manage the state of the corresponding input field.

Default Value Example

import useField from '@bunstack/hook-form-react';

const NameInputComponent: FC = () => {
  const { value: firstName, onChange: setFirstName } = useField<string>({ name: 'name.first', defaultValue: 'John' });
  const { value: lastName, onChange: setLastName } = useField<string>({ name: 'name.last', defaultValue: 'Doe' });

  return (
    <>
      <input
        id="firstName"
        type="text"
        value={firstName || ''}
        onChange={setFirstName}
      />
      <input
        id="lastName"
        type="text"
        value={lastName || ''}
        onChange={setLastName}
      />
    </>
  );
};

export default NameInputComponent;

In this example, we're using the useField hook twice, once for each part of the name. The name property of the options object passed to useField is a string that uses dot notation to specify the path to the field in the form data.

The first useField call is for the first name, so we pass { name: 'name.first', defaultValue: 'John' }. This means that the form data is expected to be an object with a name property, which is itself an object with a first property. The default value for this field is 'John'.

The second useField call is for the last name, so we pass { name: 'name.last', defaultValue: 'Doe' }. This means that the form data is expected to be an object with a name property, which is itself an object with a last property. The default value for this field is 'Doe'.

The value and onChange properties returned by useField are then used to manage the state of the corresponding input field. If there's no user-provided value for the field, the default value will be used instead.

useFields

The useFields hook is a custom React hook that helps manage the state of form fields. It provides functionalities such as resetting and cleaning field data, and registering fields with their respective handlers.

Here's an example of how you can import and use this hook:

import { useFields } from '@bunstack/hook-form-react';

function MyFormComponent() {
  const { fields } = useFields({
    name: 'myForm',
    fieldArray: [
      { name: 'firstName', type: 'text' },
      { name: 'lastName', type: 'text' },
    ],
  });

  return (
    <form>
      {fields.map((field, index) => (
        <input
          key={index}
          name={field.name}
          type={field.type}
          value={field.value}
          onChange={field.onChange}
        />
      ))}
    </form>
  );
}

Types

Schema

This TypeScript module defines several types for schema validation. Each type represents a different kind of data that can be validated. Here's a brief explanation of each type:

SchemaValidationTypeString: This type is used for validating string data. It has optional properties like required, minLength, maxLength, and pattern for additional validation rules.

SchemaValidationTypeNumber: This type is used for validating numeric data. It has optional properties like required, minimum, and maximum for additional validation rules.

SchemaValidationTypeArray: This type is used for validating array data. It has optional properties like required, minItems, maxItems, and uniqueItems for additional validation rules.

SchemaValidationTypeObject: This type is used for validating object data. It has a required property and a properties property which is a record of string keys and SchemaValidationType values for nested validation.

The SchemaValidationType is a union type of all the above types. This means a SchemaValidationType can be any one of the above types.

How to Use

To use these types, you would define a schema using the appropriate type for the data you want to validate. For example, if you want to validate a string, you would use SchemaValidationTypeString and specify the validation rules you want to apply:

const nameSchema: SchemaValidationTypeString = {
  type: 'string',
  required: true,
  minLength: 5,
  maxLength: 20,
};

const { handleSubmit, errors } = useForm({
    schema: {
        "name.first_name": nameSchema,
        "name.last_name": nameSchema
    }
})

This part of the code uses the useForm hook to create a form with schema validation. The schema property of the form is an object where each key is the name of a form field and the value is the schema for validating that field.

In this case, the form has two fields: name.first_name and name.last_name. Both fields use the nameSchema for validation, which means both fields must be strings between 5 and 20 characters long.

The useForm hook returns an object with a handleSubmit function for submitting the form and an errors object for accessing validation errors.

The dot notation in the field names (name.first_name and name.last_name) indicates that the form data is expected to be an object with a name property, which is itself an object with first_name and last_name properties. This is a common pattern for handling complex form data structures.

Props Table

useForm

| Prop | Type | Description | | ------------- | ----------------- | ---------------------------------------------------------------------------- | | defaultValues | DataType | The initial state of the form data. | | onSubmit | function | A function that is called when the form is submitted and the data is valid. | | schema | object | An object that defines the validation rules for each field in the form data. | | name | string (optional) | An optional name for the form. |

useField

| Prop | Type | Description | | ------------ | ------------------------------- | ------------------------------------------------------------------------------------- | | name | string | The name of the field. | | defaultValue | string, number, boolean, object | An optional default value in case data is fetched in the component and needs updating |

useFields

| Prop | Type | Description | | ---------- | ----- | ------------------------------------------------------------------------------------------------- | | name | string | The name of the field. | | fieldArray | array | An array of objects, each representing a field. Each object should have a name and type property. |

Please note that DataType in useForm is a generic type representing the shape of the form data. It can be any valid JavaScript data type (string, number, object, etc.) depending on the form data.