useC3ComputedFields

Сумма со скидкой

Поле total пересчитывается, когда меняется цена, количество или скидка.

Больше 100 — ошибка вычисления

Итого: 2 400 ₽

Ошибки и пустые зависимости

Все поля посчитаны

Ошибка появляется, когда compute бросает исключение, и снимается успешным пересчётом.

Пока у источника нет значения, результат сбрасывается в undefined, а compute не вызывается: total = 2400

Debounce для тяжёлого вычисления

Пауза 400 мс: быстрые правки считаются один раз

Результат: Здравствуйте, ! вычислений: 1

Ручной пересчёт и отключение

После stop() поля меняются только по updateAll(): наблюдатели сняты, а отложенные вычисления отменены.

Входные параметры

ИмяТипОписание
dataRecord<string, unknown>Реактивные данные формы: источник и место для результатов
computedFieldsC3ComputedField[]Список вычисляемых полей

Элемент computedFields (C3ComputedField)

ИмяТипПо умолчаниюОписание
targetstring—Имя поля-результата, в которое пишется значение
sourcesstring[]—Имена полей-зависимостей
compute(values) => unknown—Функция вычисления: получает текущие значения источников
debouncenumber0Пауза перед вычислением в мс: правки внутри паузы склеиваются

Возвращается

ИмяТипОписание
errorsRef<Record<string, string>>Ошибки вычисления: имя поля-результата → текст
updateAll()voidПересчитать все поля сразу
stop()voidСнять наблюдатели и отменить незавершённые отложенные вычисления

Событий и слотов у composable нет.

Описание

useC3ComputedFields связывает поля формы, которые не вводятся руками, а считаются из других: сумма, НДС, ФИО из частей, приветствие из имени. Composable следит за полями из sources и пишет результат в data[target], поэтому значение уезжает вместе с данными формы при отправке.

Первичный расчёт делается явно через updateAll(): наблюдатель реагирует только на изменения, и на сервере готовое значение пересчитывать не нужно. Поле, у которого хотя бы один источник пуст, обнуляется без вызова compute.

Дополнительная информация

  • Исключение внутри compute попадает в errors[target] с префиксом «Ошибка вычисления:», значение поля остаётся прежним. Успешный расчёт или опустевший источник ошибку снимают.
  • debounce — именно склейка правок: новая правка внутри паузы отменяет отложенное вычисление, поэтому compute вызывается один раз на серию.
  • Наблюдение идёт по sources каждого поля, а не по всем данным: изменение постороннего поля пересчёт не вызывает.
  • Результат пишется в данные только если он изменился — одинаковое значение не будит наблюдателей и не приводит к циклу пересчётов.
  • target не должен попадать в собственные sources: такой круг вычислял бы сам себя.
  • Внутри компонента наблюдатели снимаются при размонтировании; вне компонента (например, в сторе) вызывайте stop() сами, иначе они останутся живыми.
  • Пример интеграции с C3DynamicForm: держите данные формы в reactive, передавайте их в composable и вызывайте updateAll() после загрузки значения.
×