Custom Templates
This is an advanced feature that lets you customize even more aspects of the form:
| _ | Custom Field | Custom Template | Custom Widget | 
|---|---|---|---|
| What it does | Overrides all behaviour | Overrides just the layout (not behaviour) | Overrides just the input box (not layout, labels, or help, or validation) | 
| Usage | Global or per-field | Global or per-field | Global or per-field | 
| Global Example | <Form fields={MyCustomField} /> | <Form ArrayFieldTemplate={MyArrayTemplate} /> | <Form widgets={MyCustomWidget} /> | 
| Per-Field Example | "ui:field": MyCustomField | "ui:ArrayFieldTemplate": MyArrayTemplate | "ui:widget":MyCustomWidget | 
| Documentation | Custom Fields | FieldTemplate / ArrayFieldTemplate / ObjectFieldTemplate | Custom Widgets | 
ArrayFieldTemplate
You can use an ArrayFieldTemplate to customize how your arrays are rendered.
This allows you to customize your array, and each element in the array.
const schema = {
  type: "array",
  items: {
    type: "string"
  }
};
function ArrayFieldTemplate(props) {
  return (
    <div>
      {props.items.map(element => element.children)}
      {props.canAdd && <button type="button" onClick={props.onAddClick}></button>}
    </div>
  );
}
render((
  <Form schema={schema}
        ArrayFieldTemplate={ArrayFieldTemplate} />
), document.getElementById("app"));
You also can provide your own field template to a uiSchema by specifying a ui:ArrayFieldTemplate property.
const uiSchema = {
  "ui:ArrayFieldTemplate": ArrayFieldTemplate
}
Please see customArray.js for another example.
The following props are passed to each ArrayFieldTemplate:
- DescriptionField: The- DescriptionFieldfrom the registry (in case you wanted to utilize it)
- TitleField: The- TitleFieldfrom the registry (in case you wanted to utilize it).
- canAdd: A boolean value stating whether new elements can be added to the array.
- className: The className string.
- disabled: A boolean value stating if the array is disabled.
- idSchema: Object
- items: An array of objects representing the items in the array. Each of the items represent a child with properties described below.
- onAddClick: (event?) => void: A function that adds a new item to the array.
- readonly: A boolean value stating if the array is read-only.
- required: A boolean value stating if the array is required.
- schema: The schema object for this array.
- uiSchema: The uiSchema object for this array field.
- title: A string value containing the title for the array.
- formContext: The- formContextobject that you passed to Form.
- formData: The formData for this array.
- registry: The- registryobject.
The following props are part of each element in items:
- children: The html for the item's content.
- className: The className string.
- disabled: A boolean value stating if the array item is disabled.
- hasMoveDown: A boolean value stating whether the array item can be moved down.
- hasMoveUp: A boolean value stating whether the array item can be moved up.
- hasRemove: A boolean value stating whether the array item can be removed.
- hasToolbar: A boolean value stating whether the array item has a toolbar.
- index: A number stating the index the array item occurs in- items.
- key: A stable, unique key for the array item.
- onAddIndexClick: (index) => (event?) => void: Returns a function that adds a new item at- index.
- onDropIndexClick: (index) => (event?) => void: Returns a function that removes the item at- index.
- onReorderClick: (index, newIndex) => (event?) => void: Returns a function that swaps the items at- indexwith- newIndex.
- readonly: A boolean value stating if the array item is read-only.
Note: Array and object field templates are always rendered inside of the FieldTemplate. To fully customize an array field template, you may need to specify both
ui:FieldTemplateandui:ArrayFieldTemplate.
FieldTemplate
To take control over the inner organization of each field (each form row), you can define a field template for your form.
A field template is basically a React stateless component being passed field-related props, allowing you to structure your form row as you like.
const schema = {
  type: "string"
};
function CustomFieldTemplate(props) {
  const {id, classNames, label, help, required, description, errors, children} = props;
  return (
    <div className={classNames}>
      <label htmlFor={id}>{label}{required ? "*" : null}</label>
      {description}
      {children}
      {errors}
      {help}
    </div>
  );
}
render((
  <Form schema={schema}
        FieldTemplate={CustomFieldTemplate} />
), document.getElementById("app"));
You also can provide your own field template to a uiSchema by specifying a ui:FieldTemplate property.
const uiSchema = {
  "ui:FieldTemplate": CustomFieldTemplate
}
If you want to handle the rendering of each element yourself, you can use the props rawHelp, rawDescription and rawErrors.
The following props are passed to a custom field template component:
- id: The id of the field in the hierarchy. You can use it to render a label targeting the wrapped widget.
- classNames: A string containing the base Bootstrap CSS classes, merged with any custom ones defined in your uiSchema.
- label: The computed label for this field, as a string.
- description: A component instance rendering the field description, if one is defined (this will use any custom- DescriptionFielddefined).
- rawDescription: A string containing any- ui:descriptionuiSchema directive defined.
- children: The field or widget component instance for this field row.
- errors: A component instance listing any encountered errors for this field.
- rawErrors: An array of strings listing all generated error messages from encountered errors for this field.
- help: A component instance rendering any- ui:helpuiSchema directive defined.
- rawHelp: A string containing any- ui:helpuiSchema directive defined. NOTE:- rawHelpwill be- undefinedif passed- ui:helpis a React component instead of a string.
- hidden: A boolean value stating if the field should be hidden.
- required: A boolean value stating if the field is required.
- readonly: A boolean value stating if the field is read-only.
- disabled: A boolean value stating if the field is disabled.
- displayLabel: A boolean value stating if the label should be rendered or not. This is useful for nested fields in arrays where you don't want to clutter the UI.
- fields: An array containing all Form's fields including your custom fields and the built-in fields.
- schema: The schema object for this field.
- uiSchema: The uiSchema object for this field.
- onChange: The value change event handler; Can be called with a new value to change the value for this field.
- formContext: The- formContextobject that you passed to Form.
- formData: The formData for this field.
- registry: The- registryobject.
Note: you can only define a single global field template for a form, but you can set individual field templates per property using
"ui:FieldTemplate".
ObjectFieldTemplate
const schema = {
  type: "object",
  title: "Object title",
  description: "Object description",
  properties: {
    name: {
      type: "string"
    },
    age: {
      type: "number"
    }
  }
};
function ObjectFieldTemplate(props) {
  return (
    <div>
      {props.title}
      {props.description}
      {props.properties.map(element => <div className="property-wrapper">{element.content}</div>)}
    </div>
  );
}
render((
  <Form schema={schema}
        ObjectFieldTemplate={ObjectFieldTemplate} />
), document.getElementById("app"));
You also can provide your own field template to a uiSchema by specifying a ui:ObjectFieldTemplate property.
const uiSchema = {
  "ui:ObjectFieldTemplate": ObjectFieldTemplate
};
Please see customObject.js for a better example.
The following props are passed to each ObjectFieldTemplate:
- DescriptionField: The- DescriptionFieldfrom the registry (in case you wanted to utilize it)
- TitleField: The- TitleFieldfrom the registry (in case you wanted to utilize it).
- title: A string value containing the title for the object.
- description: A string value containing the description for the object.
- disabled: A boolean value stating if the object is disabled.
- properties: An array of object representing the properties in the array. Each of the properties represent a child with properties described below.
- onAddClick: (schema: JSONSchema7) => () => void: Returns a function that adds a new property to the object (to be used with additionalProperties)
- readonly: A boolean value stating if the object is read-only.
- required: A boolean value stating if the object is required.
- schema: The schema object for this object.
- uiSchema: The uiSchema object for this object field.
- idSchema: An object containing the id for this object & ids for it's properties.
- formData: The form data for the object.
- formContext: The- formContextobject that you passed to Form.
- registry: The- registryobject.
The following props are part of each element in properties:
- content: The html for the property's content.
- name: A string representing the property name.
- disabled: A boolean value stating if the object property is disabled.
- readonly: A boolean value stating if the property is read-only.
- hidden: A boolean value stating if the property should be hidden.
Note: Array and object field templates are always rendered inside of the FieldTemplate. To fully customize an object field template, you may need to specify both
ui:FieldTemplateandui:ObjectFieldTemplate.