В Cleave.js ключевая модель работы строится вокруг разделения данных на два представления: исходное значение (raw value) и отформатированное значение (formatted value). Эта концепция определяет поведение всей библиотеки и влияет на то, как данные извлекаются, сохраняются и передаются дальше по приложению.
Raw value представляет собой «чистые» данные без визуального форматирования. Обычно это:
Formatted value — это строка, отображаемая в input-поле, с применёнными правилами маскирования:
Эта двойственность лежит в основе всех механизмов библиотеки: пользователь работает с formatted value, а бизнес-логика — с raw value.
После инициализации Cleave.js перехватывает управление значением поля ввода. В результате:
input.value всегда содержит форматированную
строку;Пример типичного поведения:
1234567890+1 (234) 567-8901234567890После создания экземпляра:
const cleave = new Cleave(input, {
phone: true,
phoneRegionCode: 'US'
});
становится доступным объект управления состоянием.
Отформатированное значение совпадает с тем, что находится в DOM-элементе:
const formatted = input.value;
или через экземпляр:
const formatted = cleave.properties.result;
В разных версиях Cleave.js внутреннее хранение может отличаться, но логика остаётся одинаковой: отображаемое значение всегда доступно как результат форматирования.
Основной способ извлечения raw value:
const raw = cleave.getRawValue();
Метод возвращает строку без маски, полностью очищенную от форматирования.
Пример поведения:
| Ввод | Форматированное | Raw |
|---|---|---|
| 1234 5678 9012 3456 | 1234 5678 9012 3456 | 1234567890123456 |
В сценариях с числовыми масками возможны дополнительные преобразования:
Для управления состоянием извне используется обратная синхронизация.
cleave.setRawValue('1234567890');
После вызова:
Это особенно важно при:
В большинстве случаев прямой установки formatted value не требуется, так как библиотека всегда нормализует ввод. Однако можно присвоить значение через input:
input.value = '+1 (234) 567-890';
cleave.setRawValue(cleave.getRawValue());
Такой подход используется для принудительной нормализации состояния.
Одним из наиболее важных механизмов получения значений является
callback onValueChanged, который вызывается при каждом
изменении input.
const cleave = new Cleave(input, {
phone: true,
onValueChanged: function(e) {
console.log(e.target.value); // formatted value
console.log(e.target.rawValue); // raw value
}
});
Структура объекта события обычно включает:
target — DOM-элемент inputvalue — текущее отформатированное значениеrawValue — исходное значение без маскиЭтот механизм позволяет полностью отказаться от ручного парсинга input.value.
В рамках onValueChanged важно различать два поля:
e.value — визуальное представление, синхронизированное
с UIe.rawValue — чистые данные для бизнес-логикиТипичный пример использования:
onValueChanged: function(e) {
sendToServer({
phone: e.rawValue
});
}
Таким образом, UI остаётся форматированным, а передача данных — стандартизированной.
При использовании числового режима (numeral: true)
поведение raw value может отличаться:
const cleave = new Cleave(input, {
numeral: true,
numeralThousandsGroupStyle: 'thousand'
});
В этом режиме:
Пример:
| Ввод | Форматированное | Raw |
|---|---|---|
| 10000 | 10,000 | 10000 |
| 10000.50 | 10,000.50 | 10000.50 |
Разные режимы Cleave.js по-разному формируют raw value:
Это важно учитывать при унификации обработки данных на сервере.
Cleave.js поддерживает двустороннюю синхронизацию:
onValueChangedЛюбое внешнее изменение через setRawValue инициирует тот
же цикл в обратном направлении.
input.value всегда возвращает formatted строку.
Использование её как raw приводит к:
Удаление символов через replace или regex часто конфликтует с внутренней логикой Cleave.js. Это приводит к:
В React, Vue или Angular при контролируемых компонентах часто
сохраняется только formatted value, если не обрабатывать
onValueChanged корректно. Это приводит к потере исходных
данных при сабмите формы.
На уровне архитектуры обычно разделяют:
Такой подход снижает зависимость от конкретного формата отображения и упрощает миграцию масок без изменения backend-логики.
Cleave.js всегда оперирует парой значений:
value)rawValue)Их корректное использование обеспечивает стабильное поведение масок, предсказуемую сериализацию данных и отсутствие необходимости вручную парсить пользовательский ввод.