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', // считаем только для ипотеки
},
);
};