``` /** * * @type {React.ForwardRefExoticComponent<React.PropsWithoutRef<*> & React.RefAttributes<unknown>>} */ export const FormField = forwardRef((componentProps, ref) => { const form = useForm() const schema = useSchema() const innerRef = useRef() const fieldRef = ref || innerRef const { name, children, ignoreHidden, ...props } = componentProps const data = useMemo(() => { const fieldSchema = getField(schema, name) if (fieldSchema?.dynamicOptions instanceof Function) { fieldSchema.options = fieldSchema.dynamicOptions(form.value, form) if ( form.value[name] && fieldSchema.options && !fieldSchema.options.hasOwnProperty(form.value[name]) ) { clearError(form, name) try { form.value[name] = null } catch (e) { // property can be readonly } form.onChange(name, null) } } if (fieldSchema?.dateOptions instanceof Function) { fieldSchema.dateOptions = fieldSchema.dateOptions({ ...form.value }) } if (!fieldSchema) return { hidden: true } const [hint, hintOptions] = getHint(schema, name, form) return { name, label: getLabel(schema, name, form), parser: getParser(schema, name), getter: getGetter(schema, name), hidden: fieldSchema.hidden instanceof Function ? fieldSchema.hidden({ ...form.value }, form.context) : !!fieldSchema.hidden, disabled: fieldSchema.disabled instanceof Function ? fieldSchema.disabled({ ...form.value }, fieldSchema) : !!fieldSchema.disabled, formatter: getFormatter(schema, name), schema: fieldSchema, hint, hintOptions, effects: fieldSchema.effects || undefined, error: getError(form, name), validation: fieldSchema.validation, clearError: clearError(form, name), validate: () => validateField(schema, form, name), rawValue: form.value && form.value[name], type: fieldSchema.type, } }, [form, schema]) useEffect(() => { const refId = form.addFieldRef(fieldRef, { name }) return () => { form.removeFieldRefById(refId) } }, []) useEffect(() => { form.focusToFirstError && handleFirstErrorFieldFocus(form) }, [form.errors]) if (data.hidden && !ignoreHidden) { return null } return ( <div {...props} data-loc={name} ref={fieldRef}> <FormFieldContext.Provider value={data}> {children} </FormFieldContext.Provider> </div> ) }) ```