2.1.1 • Published 4 years ago

use-form-field v2.1.1

Weekly downloads
2
License
MIT
Repository
github
Last release
4 years ago

use-form-field

An unopionated react form context library using hooks and the context API.

Install

npm install use-form-field

Documentation

useFormField

useFormField(name, (controlled = false));

Options

name - string name to use for the form field.

controlled - boolean optional Whether field is going to be controlled or not. Ultimately this will assume you are using the ref as opposed to the value and not trigger a re-render on value changes.

Example

import { useFormField } from "use-form-field";

const UncontrolledInput = ({ name }) => {
  const { set, ref, error } = useFormField(name);

  const handleChange = e => {
    set(e.target.value, true);
  };

  return (
    <React.Fragment>
      <input name={name} type="text" onChange={handleChange} ref={ref} />
      {error}
    </React.Fragment>
  );
};

useForm

useForm({ withValues = false, onChange });

Options

withValues - boolean optional Whether to return complete values object. This will cause re-renders on change

onChange - function optional Function containing object of changed values.

Example

import { useForm } from "use-form-field";

const Form = () => {
  const { get, isValid } = useForm();
  const [values, setValues] = useState(undefined);

  const handleSubmit = e => {
    e.preventDefault();
    setValues(get());
  };

  return (
    <React.Fragment>
      <form onSubmit={handleSubmit}>
        <UncontrolledInput name="field" />
        <br />
        <button type="submit" disabled={!isValid}>
          Submit
        </button>
      </form>
      {values && JSON.stringify(values)}
    </React.Fragment>
  );
};

FormProvider

<FormProvider />

Options

values - object optional An object containing values to set field values to.

schema - object optional A yup compatible schema for automatic validation

children - Children can be React elements or a function, if using a function you will receive the return value from useForm() and you may pass additional props to FormProvider that will be used as arguments for useForm().

Example (JSX)

import { FormProvider } from "use-form-field";

const App = () => (
  <FormProvider>
    <Form />
  </FormProvider>
);

Example (Function)

import { FormProvider } from "use-form-field";

const App = () => (
  <FormProvider withValues>
    {({ values, isValid }) => (
      <React.Fragment>
        <Form />
        {[JSON.stringify(values), " ", isValid ? "valid" : "invalid"]}
      </React.Fragment>
    )}
  </FormProvider>
);

Full example with dynamic fields

import { FormProvider, useForm, useFormField } from "use-form-field";
import { object, string } from "yup";

const initialValues = {
  field1: "field 1",
  field2: "field 2"
};
const validationSchema = object().shape({
  field1: string().max(20),
  field2: string().max(20)
});

const ControlledInput = ({ name }) => {
  const { set, value, error } = useFormField(name, true);

  const handleChange = e => {
    set(e.target.value, true);
  };

  return (
    <React.Fragment>
      <input name={name} type="text" onChange={handleChange} value={value} />
      {error}
    </React.Fragment>
  );
};

const UncontrolledInput = ({ name }) => {
  const { set, ref, error } = useFormField(name);

  const handleChange = e => {
    set(e.target.value, true);
  };

  return (
    <React.Fragment>
      <input name={name} type="text" onChange={handleChange} ref={ref} />
      {error}
    </React.Fragment>
  );
};

const Form = () => {
  const { get, isValid } = useForm();
  const [values, setValues] = useState(undefined);
  const [fields, setFields] = useState(["field1", "field2"]);

  const handleSubmit = e => {
    e.preventDefault();
    setValues(get());
  };

  const handleFlip = () => {
    setFields([...fields.reverse()]);
  };

  return (
    <React.Fragment>
      <form onSubmit={handleSubmit}>
        <ControlledInput name={fields[0]} />
        <br />
        <UncontrolledInput name={fields[1]} />
        <br />
        <button type="button" onClick={handleFlip}>
          Flip
        </button>
        <button type="submit" disabled={!isValid}>
          Submit
        </button>
      </form>
      {values && JSON.stringify(values)}
    </React.Fragment>
  );
};

const App = () => (
  <FormProvider values={initialValues} schema={validationSchema}>
    <Form />
  </FormProvider>
);
2.1.1

4 years ago

2.1.0

4 years ago

2.0.0

4 years ago

1.1.1

5 years ago

1.1.0

5 years ago

1.0.3

5 years ago

1.0.2

5 years ago

1.0.1

5 years ago

1.0.0

5 years ago