Special inputs

As listed in our features, the library supports all native HTML form fields. This includes the HTML <select /> element as well as special cases of the <input /> element.

In our playground you can take a look at such fields and test them out.

Checkbox

A simple checkbox represents a boolean and is true when checked or false otherwise.

<Field name="cookies" type="boolean">
  {(field, props) => (
    <label>
      <input {...props} type="checkbox" checked={field.value} />
      Yes, I want cookies
    </label>
  )}
</Field>

However, you can also use multiple checkboxes to represent an array of strings. For this you simply have to add the value attribute to the HTML <input /> element.

{
  [
    { label: 'Bananas', value: 'bananas' },
    { label: 'Apples', value: 'apples' },
    { label: 'Grapes', value: 'grapes' },
  ].map(({ label, value }) => (
    <Field key={value} name="fruits" type="string[]">
      {(field, props) => (
        <label>
          <input
            {...props}
            type="checkbox"
            value={value}
            checked={field.value.value?.includes(value)}
          />
          {label}
        </label>
      )}
    </Field>
  ));
}

Select

An HTML <select /> element allows you to select a string from a predefined list of options.

<Field name="framework">
  {(field, props) => (
    <select {...props}>
      {[
        { label: 'Preact', value: 'preact' },
        { label: 'Solid', value: 'solid' },
        { label: 'Qwik', value: 'qwik' },
      ].map(({ label, value }) => (
        <option
          key={value}
          value={value}
          selected={field.value.value === value}
        >
          {label}
        </option>
      ))}
    </select>
  )}
</Field>

However, if you set the multiple attribute, multiple options can be selected making the field represent an array of strings.

<Field name="framework" type="string[]">
  {(field, props) => (
    // Set "multiple" to "true"
    <select {...props} multiple>
      {[
        { label: 'Preact', value: 'preact' },
        { label: 'Solid', value: 'solid' },
        { label: 'Qwik', value: 'qwik' },
      ].map(({ label, value }) => (
        <option
          key={value}
          value={value}
          selected={field.value.value?.includes(value)}
        >
          {label}
        </option>
      ))}
    </select>
  )}
</Field>

File

For the HTML <input type="file" /> element it works similar to the HTML <select /> element. Without the multiple attribute it represents a single file and with, a list of files.