useC3ComputedFields
Сумма со скидкой
Поле total пересчитывается, когда меняется цена, количество или скидка.
Больше 100 — ошибка вычисления
Итого: 2 400 ₽
Ошибки и пустые зависимости
Все поля посчитаны
Пока у источника нет значения, результат сбрасывается в undefined, а compute не вызывается: total = 2400
Debounce для тяжёлого вычисления
Пауза 400 мс: быстрые правки считаются один раз
Результат: Здравствуйте, ! вычислений: 1
Ручной пересчёт и отключение
После stop() поля меняются только по updateAll(): наблюдатели сняты, а отложенные вычисления отменены.
Входные параметры
| Имя | Тип | Описание |
|---|---|---|
data | Record<string, unknown> | Реактивные данные формы: источник и место для результатов |
computedFields | C3ComputedField[] | Список вычисляемых полей |
Элемент computedFields (C3ComputedField)
| Имя | Тип | По умолчанию | Описание |
|---|---|---|---|
target | string | — | Имя поля-результата, в которое пишется значение |
sources | string[] | — | Имена полей-зависимостей |
compute | (values) => unknown | — | Функция вычисления: получает текущие значения источников |
debounce | number | 0 | Пауза перед вычислением в мс: правки внутри паузы склеиваются |
Возвращается
| Имя | Тип | Описание |
|---|---|---|
errors | Ref<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()после загрузки значения.