Перейти к основному содержимому

computeFrom()

function computeFrom<TForm, TTarget>(
sources,
target,
computeFn,
options?): void;

Defined in: core/behavior/behaviors/compute-from.ts:82

Автоматически вычисляет значение поля на основе других полей

Type Parameters

TForm

TForm

TTarget

TTarget

Parameters

sources

FieldPathNode<TForm, any, unknown>[]

Массив полей-зависимостей

target

FieldPathNode<TForm, TTarget>

Поле для записи результата

computeFn

(values) => TTarget

Функция вычисления (принимает объект с именами полей)

options?

ComputeFromOptions<TForm>

Опции (debounce, condition, trigger)

Returns

void

Examples

import { computeFrom, type BehaviorSchemaFn } from '@reformer/core/behaviors';

interface OrderForm {
price: number;
quantity: number;
total: number;
}

export const orderBehavior: BehaviorSchemaFn<OrderForm> = (path) => {
computeFrom(
[path.price, path.quantity],
path.total,
(values) =>
(typeof values.price === 'number' ? values.price : 0) *
(typeof values.quantity === 'number' ? values.quantity : 0),
);
};
import { computeFrom, type BehaviorSchemaFn } from '@reformer/core/behaviors';

interface MortgageForm {
loanType: 'mortgage' | 'consumer';
loanAmount: number;
loanTerm: number;
interestRate: number;
monthlyPayment: number;
}

function annuity(values: MortgageForm): number {
const { loanAmount, loanTerm, interestRate } = values;
if (!loanAmount || !loanTerm || !interestRate) return 0;
const r = interestRate / 100 / 12;
const n = loanTerm;
return Math.round((loanAmount * r * Math.pow(1 + r, n)) / (Math.pow(1 + r, n) - 1));
}

export const mortgageBehavior: BehaviorSchemaFn<MortgageForm> = (path) => {
computeFrom(
[path.loanAmount, path.loanTerm, path.interestRate],
path.monthlyPayment,
annuity,
{
debounce: 300, // не пересчитываем на каждый keystroke
condition: (form) => form.loanType === 'mortgage', // считаем только для ипотеки
},
);
};

See

docs/llms/20-compute-vs-watch.md