В Cleave.js обработчик onValueChanged представляет собой
один из ключевых механизмов реакции на изменение значения поля ввода,
позволяющий синхронизировать форматированное отображение с внутренним
состоянием данных и внешними системами управления формой.
Функционально этот обработчик вызывается каждый раз, когда библиотека выполняет преобразование значения input-элемента. Это включает ввод символов пользователем, программное изменение значения через API Cleave.js, а также любые операции автоформатирования, такие как вставка разделителей, преобразование даты, группировка чисел или маскирование.
Внутри жизненного цикла Cleave.js изменение значения проходит несколько этапов:
onValueChangedТаким образом, onValueChanged всегда срабатывает уже
после того, как библиотека сформировала итоговое отображаемое значение и
обновила поле ввода.
Ключевая особенность заключается в том, что обработчик фиксирует не сам факт ввода, а именно результат работы форматтера.
Типичная форма объявления:
new Cleave(inputElement, {
onValueChanged: function (event) {
// обработка изменений
}
});
В большинстве реализаций Cleave.js в объект event
передаётся структурированная информация о состоянии поля.
Объект, поступающий в onValueChanged, содержит данные,
отражающие одновременно три слоя представления значения:
Особое значение имеет различие между value и
rawValue. Это различие лежит в основе архитектуры
Cleave.js.
value всегда соответствует тому, что пользователь видит
в поле. Например:
1234567890 → 1 234 567 890
или
20260101 → 2026-01-01
Это значение используется для отображения и взаимодействия с UI.
rawValue представляет собой данные без
форматирования:
1 234 567 890 → 1234567890
Именно это значение обычно применяется для:
onValueChanged выступает связующим звеном между
внутренней логикой Cleave.js и внешними системами управления
состоянием.
Наиболее типичные сценарии использования:
В архитектуре, где input является частью управляемого состояния, обработчик используется для обновления store:
onValueChanged: function (event) {
state.value = event.target.value;
state.raw = event.rawValue;
}
При этом важно учитывать, что event.target.value уже
содержит форматированное значение, тогда как rawValue —
пригоден для вычислений.
При работе с формами обработчик часто используется для разделения отображаемого и отправляемого значений:
valuerawValueЭто позволяет избегать дополнительных преобразований перед submit-операцией.
Обработчик позволяет реализовать мгновенную реакцию интерфейса:
onValueChanged может вызываться:
setRawValue или аналогичных
методовЭто делает обработчик высокочастотным и потенциально чувствительным к производительности.
При тяжёлой логике внутри обработчика возможны следующие проблемы:
Поэтому рекомендуется избегать сложных вычислений внутри
onValueChanged.
Обработчик срабатывает не только на пользовательский ввод, но и при вызове API:
setRawValueЭто важно учитывать при предотвращении циклических обновлений.
При интеграции с реактивными фреймворками возникает риск двойного обновления состояния:
Чтобы избежать конфликтов, onValueChanged обычно
используется как единственная точка синхронизации:
onValueChanged: (event) => {
setState({
formatted: event.target.value,
raw: event.rawValue
});
}
При этом важно избегать обратного перезаписывания значения input без необходимости.
В отличие от input или change,
onValueChanged:
Таким образом, стандартные DOM-события и onValueChanged
решают разные задачи и не являются взаимозаменяемыми.
Использование только event.target.value приводит к
ошибкам при работе с числами и датами, так как форматирование может
искажать данные.
Изменение input внутри onValueChanged может вызвать
рекурсивные обновления:
Это приводит к нестабильному поведению.
Выполнение сетевых запросов или сложных вычислений внутри обработчика приводит к деградации UX.
onValueChanged фактически выполняет роль наблюдателя
состояния (observer), предоставляя точку контроля над всеми изменениями
значения input. Он связывает:
за счёт единого события, содержащего уже нормализованные данные.