control-form

A component for controlled forms and components


Keywords
controlled-components, forms, react, react-components, state-management
License
MIT
Install
npm install control-form@2.2.1

Documentation

Build Status

control-form

React component for controlled forms.

Install

npm version

npm install control-form

Example

import { ControlForm } from "control-form";

export default props => (
  <ControlForm
    initialState={{ name: "", selectKey: "", radioKey: "", checkboxKey: false }}
    onSubmit={formState => console.log(`Hello, ${formState.name}`)}
  >
    {({ wire, state }) => {
      <div>
        <div>
          <label>Text Input</label>
          <input type="text" {...wire("name")} />
        </div>

        <div>
          <label>Select options</label>
          <select {...wire("selectKey")}>
            <option />
            <option value="first">First</option>
            <option value="second">Second</option>
          </select>
        </div>

        <div>
          <label>Yes</label>
          <input type="radio" value="yes" {...wire.radio("radioKey", "yes")} />
          <label>No</label>
          <input type="radio" value="no" {...wire.radio("radioKey", "no")} />
        </div>

        <div>
          <label>Checkbox</label>
          <input type="checkbox" {...wire.checkbox("checkboxKey")} />
        </div>

        <button disabled={state.name.length === 0 || state.checkboxKey}>
          Submit
        </button>
      </div>;
    }}
  </ControlForm>
);

ControlForm

initialState

Define the data keys and types used in the form. This state will also be used when resetting the form.

onSubmit

Callback receiving the form's state when a submit event occurs.

onChange

Callback receiving the form's state when a change event occurs.

onReset

Callback receiving the form's state when a reset event occurs.

children

Function receiving wire, wiring and state and returning form elements.

wire(key, [wiring], [valueProp])

Returns a callback with onChange & value props to pass to connected components. The key needs match a key present in the initialState prop.

<input type="text" {...wire("key")} />

wiring & valueProp are optional parameters for how controlled components are connected. Here's an example using a checkbox:

<input type="checkbox" {...wire("key", wiring.checked, "checked")} />

This makes it easy to wire up custom components.

<CustomInput {...wire("key", e => e.path.to.event.data, "data")} />
wire.checkbox(key)

Alias for wiring up checkboxes

<input type="checkbox" {...wire.checked("key")} />
wire.radio(key, conditionalValue)

Alias for wiring up radio buttons. If the form's state.key equals the conditionalValue the radio checked will be true.

<input type="radio" value="someValue" {...wire.radio("key", "someValue")} />

wiring

Functions to map onChange event data to state data.

  • input: e => e.target.value
  • checked: e => e.target.checked
  • value: e => e

state

Read only copy of the form's current state. This is useful for displaying text or disabling form elements based on state.

<input
  type="text"
  {...wire("key")}
  disabled={state.otherStateKey.length === 0}
/>

...props

Remaining props will be passed directly to the underlying form