@letar/forms

Компонент Form

Главный составной компонент Form и его подкомпоненты

Form

Корневой составной компонент. Предоставляет контекст формы и валидацию.

<Form
  schema={Schema}
  initialValue={data}
  onSubmit={async ({ value }) => { ... }}
>
  {/* Компоненты полей */}
</Form>

Props

ПропТипОписание
schemaZodObjectZod схема валидации
initialValueTНачальные данные формы
onSubmit(props: { value: T }) => Promise<void>Обработчик отправки
onError(errors: FieldErrors) => voidОбработчик ошибок
offlineOfflineConfigКонфигурация офлайн-режима
persistencePersistenceConfigАвтосохранение в localStorage
debugboolean | 'force'Показать DebugValues (только FromSchema)
childrenReactNodeСодержимое формы

persistence

<Form
  schema={Schema}
  initialValue={data}
  onSubmit={handleSubmit}
  persistence={{
    key: 'checkout-form',
    debounceMs: 500,
    dialogTitle: 'Восстановить черновик?',
    dialogDescription: 'У вас есть несохранённые изменения.',
    restoreLabel: 'Восстановить',
    discardLabel: 'Отменить',
  }}
>

Form.Field.*

40+ компонентов полей. См. Типы полей.

Общие пропсы всех полей:

ПропТипОписание
namestringИмя поля, совпадающее с ключом схемы
labelstringПереопределить метку из схемы
placeholderstringПереопределить placeholder
helperTextstringДополнительная подсказка
requiredbooleanОбязательное поле
disabledbooleanОтключить поле

Form.Group

Группировка полей во вложенный объект:

<Form.Group name="address">
  <Form.Field.String name="street" />
</Form.Group>

List

API: Form.Group.List

Динамический массив элементов:

<Form.Group.List name="items" sortable>
  <Form.Field.String name="title" />
  <Form.Group.List.Button.Add />
  <Form.Group.List.Button.Remove />
</Form.Group.List>

Form.Steps

Мультистеп мастер. См. Мультистеп формы.

Form.When

Условный рендеринг. См. Условные поля.

Form.Errors

Компонент сводки ошибок:

<Form.Errors title="Исправьте:" showFieldNames />

Submit

API: Form.Button.Submit

Кнопка отправки, которая автоматически показывает спиннер загрузки во время отправки формы. Подписывается на состояние isSubmitting — когда onSubmit возвращает Promise, кнопка остаётся в состоянии загрузки до его разрешения.

Props

ПропТипПо умолчаниюОписание
childrenReactNode"Submit"Содержимое кнопки — текст, иконка, любой элемент
loadingTextReactNodeТекст при отправке (заменяет children)
disabledbooleanfalseОтключить кнопку
colorPalettestringЦветовая палитра ("brand", "blue", "red")
size"xs" | "sm" | "md" | "lg""md"Размер кнопки
variant"solid" | "outline" | "ghost" | "subtle""solid"Вариант кнопки
widthstring | numberШирина кнопки ("100%" для полной ширины)

Базовое использование

<Form.Button.Submit>Сохранить</Form.Button.Submit>

Текст при загрузке

Показать кастомный текст во время отправки:

<Form.Button.Submit loadingText="Сохранение...">Сохранить</Form.Button.Submit>

Кастомная стилизация

<Form.Button.Submit colorPalette="brand" size="lg" width="100%">
  Создать аккаунт
</Form.Button.Submit>

Как работает загрузка

Кнопка автоматически переходит в состояние загрузки, когда onSubmit — асинхронная функция. Чтобы увидеть эффект, добавьте задержку:

<Form
  schema={Schema}
  initialValue={data}
  onSubmit={async ({ value }) => {
    await new Promise((r) => setTimeout(r, 1500))
    alert(`Отправлено: ${JSON.stringify(value)}`)
  }}
>
  <Form.Field.String name="name" />
  <Form.Button.Submit loadingText="Отправка...">Отправить</Form.Button.Submit>
</Form>

Reset

API: Form.Button.Reset

Сброс формы к начальным значениям:

<Form.Button.Reset>Сбросить</Form.Button.Reset>

Form.FromSchema

Автогенерация формы из схемы:

<Form.FromSchema schema={Schema} initialValue={data} onSubmit={handleSubmit} submitLabel="Создать" columns={2} />

Form.AutoFields

Автогенерация полей с фильтрацией:

<Form.AutoFields />
<Form.AutoFields include={['name', 'email']} />
<Form.AutoFields exclude={['id', 'createdAt']} />
ПропТипОписание
includestring[]Только эти поля
excludestring[]Пропустить эти поля
recursivebooleanАвто вложенные объекты (по умолчанию: true)

Form.DebugValues

Интерактивный JSON-инспектор значений формы:

<Form.DebugValues title="Текущие значения" collapsed={3} />

Form.DirtyGuard

Предупреждение о несохранённых изменениях при уходе со страницы:

<Form.DirtyGuard title="Несохранённые изменения" message="Вы уверены?" />

Form.Subscribe

Реактивная подписка на значения формы:

<Form.Subscribe>{(values) => <Preview data={values} />}</Form.Subscribe>

См. Управляемое состояние.

createForm

Создание расширенной формы. См. createForm guide.

On this page