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

use-validation-form

v1.0.1

Published

React hook for form input handling and validation

Downloads

5

Readme

use-validation-form

React hook for form input handling and validation

NPM Build Status codecov

Table of Contents

Install

npm install --save use-validation-form

Usage

import * as React from 'react';

import { useValidationForm } from 'use-validation-form';

const MyForm = () => {
  const defaultValues = {
    myInput: '',
  };
  const validators = {
    myInput: v => v < 3 && 'Input must be greater than 2 characters!',
  };

  const { values, errors, onChange, onSubmit} = useValidationForm({
    defaultValues,
    validators,
    callback: () => { alert('onSubmit called!'); },
  });

  return (
    <form onSubmit={onSubmit}>
      <input type="text" name="myInput" value={values.myInput} onChange={onChange}>
      {errors.myInput && <span>{errors.myInput}</span>}

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

Rules

  • The input must have a defaultValue.
  • The input must have a name which is identical to the corresponding key in defaultValues and validators.
  • The input must have a connected value and onChange prop.

Supported Input Types:

Input

<input type="text" name="myInput" value={values.myInput} onChange={onChange} />

Textarea

<textarea name="myTextarea" value={values.myTextarea} onChange={onChange} />

Checkbox

// Use checked instead of value
// defaultValue must be boolean
<input
  type="checkbox"
  name="myCheckbox"
  checked={values.myCheckbox}
  onChange={onChange}
/>

Select

<select name="mySelect" value={values.mySelect} onChange={onChange}>
  <option value="one">One</option>
  <option value="two">Two</option>
  <option value="three">Three</option>
</select>

Multiple Select

// defaultValue must be an array
<select
  multiple
  size="3"
  name="myMultipleSelect"
  value={values.myMultipleSelect}
  onChange={onChange}
>
  <option value="one">One</option>
  <option value="two">Two</option>
  <option value="three">Three</option>
</select>

Radio

// To treat multiple radio buttons as one group each must have the same name
<div>
  <label className="radio">
    <input
      type="radio"
      name="myRadio"
      checked={values.myRadio === 'foo'}
      value="foo"
      onChange={onChange}
    />
    Foo
  </label>
  <label className="radio">
    <input
      type="radio"
      name="myRadio"
      checked={values.myRadio === 'bar'}
      value="bar"
      onChange={onChange}
    />
    Bar
  </label>
</div>

API

const {
  values,
  errors,
  isValid,
  isDirty,
  isSubmitting,
  validateAll,
  onChange,
  onSubmit,
} = useValidationForm({
  defaultValues,
  validators,
  callback,
});
  • values Object with current form values. Key is equal to the name of the input. Value is equal to the value of the input.
  • errors Object with current thrown errors. Key is equal to the name of the input. Value is equal to the string defined in the validators object.
  • isValid Boolean. Is true if there are no errors present.
  • isDirty Boolean. Is true as soon as the user starts interacting with any controlled input.
  • isSubmitting Boolean. True when submitting (After all inputs were validated). False after the callback was called.
  • validateAll Function to validate all inputs at the same time.
  • onChange onChange handler which should be passed to the input's onChange (onBlur, etc.) handler.
  • onSubmit onSubmit handler which should be passed the the form's onSubmit handler.
// Parameter object

type Validator = (value: any) => string | false;

export interface Validators {
  [key: string]: Validator;
}

export interface DefaultValues {
  [key: string]: any;
}

interface Arguments {
  defaultValues: DefaultValues;
  validators?: Validators;
  callback?: () => void;
}

Docs

Read The Docs

Changelog

  • v1.0.0: Initial version
    • v1.0.1: Code cleanup

License

MIT


This hook is created using create-react-hook.