Библиотека Cleave.js предназначена для форматирования пользовательского ввода в реальном времени без изменения исходного значения данных. Основная идея заключается в разделении отображаемого значения и фактического значения, которое может быть использовано в логике приложения или отправлено на сервер.
Ключевой принцип работы заключается в обработке input-событий и применении правил форматирования к строке, вводимой пользователем. При этом библиотека не выполняет валидацию в строгом смысле, а концентрируется именно на визуальном представлении данных.
Основные сценарии применения включают:
Библиотека распространяется через npm и может быть подключена как модуль ES или CommonJS.
npm install cleave.js
import Cleave from 'cleave.js';
<script src="https://cdn.jsdelivr.net/npm/cleave.js/dist/cleave.min.js"></script>
При подключении через CDN глобальный объект Cleave
становится доступным в области window.
Cleave.js работает как обёртка над DOM-элементом input. При инициализации создаётся экземпляр, который подписывается на события ввода и изменения значения поля.
const cleave = new Cleave('.input-element', {
creditCard: true
});
В этом случае ввод автоматически форматируется как номер банковской карты с группировкой по 4 цифры.
Внутренне библиотека:
Один из наиболее распространённых режимов —
creditCard.
new Cleave('.card-input', {
creditCard: true
});
Поддерживаются основные типы карт:
Алгоритм определения типа карты основан на префиксах (BIN range). Форматирование автоматически подстраивается под длину номера и структуру.
Дополнительный режим визуального разделения может быть расширен кастомными блоками:
new Cleave('.card-input', {
creditCard: true,
onCreditCardTypeChanged: function (type) {
console.log(type);
}
});
Cleave.js содержит встроенные пресеты для телефонов различных стран.
new Cleave('.phone-input', {
phone: true,
phoneRegionCode: 'RU'
});
Возможности включают:
Для разных регионов применяются различные маски, например:
(123) 456-7890+44 20 1234 5678+7 (999) 123-45-67Режим numeral используется для форматирования чисел с
разделителями, десятичными знаками и ограничениями.
new Cleave('.number-input', {
numeral: true,
numeralThousandsGroupStyle: 'thousand'
});
Поддерживаемые группы:
thousand — стандартная группировка по 3 цифры;lakh — индийская система;wan — китайская система.Дополнительные параметры:
new Cleave('.number-input', {
numeral: true,
numeralDecimalMark: '.',
delimiter: ',',
numeralDecimalScale: 2
});
Особенности режима:
Режим date используется для приведения ввода к
структурированному виду.
new Cleave('.date-input', {
date: true,
datePattern: ['d', 'm', 'Y']
});
Возможные варианты паттернов:
d — день;m — месяц;Y — год.Примеры комбинаций:
['d', 'm', 'Y'] // 31/12/2025
['Y', 'm', 'd'] // 2025-12-31
Также поддерживается ограничение диапазонов значений:
Наиболее гибкий механизм Cleave.js основан на использовании
blocks, delimiter и
numericOnly.
new Cleave('.custom-input', {
blocks: [3, 3, 4],
delimiter: '-'
});
Результат:
123-456-7890
Механизм блоков позволяет описывать любую структуру ввода:
Пример сложной структуры:
new Cleave('.code-input', {
blocks: [4, 4, 4, 4],
delimiter: ' '
});
Параметр delimiter определяет символ разделения
блоков.
delimiter: '-'
delimiter: ' '
delimiter: '/'
Дополнительно поддерживаются массивы разделителей:
delimiter: ['(', ')', ' ']
Такой подход используется для сложных телефонных или идентификационных форматов.
Cleave.js использует стратегию переформатирования строки при каждом изменении.
Основные этапы:
Особенность заключается в том, что позиция курсора корректируется автоматически, что предотвращает “прыжки” каретки при вводе.
После инициализации доступен объект экземпляра, содержащий методы управления состоянием.
const cleave = new Cleave('.input', {
numeral: true
});
Основные операции:
cleave.setRawValue('1234567');
cleave.getRawValue();
cleave.destroy();
setRawValue — установка необработанного значения;getRawValue — получение “чистого” значения без
форматирования;destroy — отключение обработки и возврат к обычному
input.Cleave.js предоставляет события изменения состояния.
new Cleave('.input', {
onValueChanged: function (e) {
console.log(e.target.value);
console.log(e.target.rawValue);
}
});
Структура события включает:
Это позволяет синхронизировать данные с внешними моделями состояния.
Существует обёртка для React:
import Cleave from 'cleave.js/react';
<Cleave
options={{ numeral: true }}
onCha nge={handleChange}
/>
Компонент управляет жизненным циклом экземпляра и синхронизацией props.
Интеграция возможна через директивы или прямую инициализацию в mounted-хуке.
mounted() {
this.cleave = new Cleave(this.$refs.input, {
date: true
});
}
Используется инициализация в lifecycle-хуках компонентов:
ngAfterViewInit() {
new Cleave(this.input.nativeElement, {
phone: true
});
}
Поведение библиотеки имеет ряд характерных ограничений:
При этом обеспечивается высокая стабильность форматирования и предсказуемость результата.
Архитектура Cleave.js базируется на последовательной обработке строки:
Такое разделение обеспечивает независимость логики форматирования от UI-слоя и упрощает расширение поведения.
Расширение функциональности реализуется через создание собственных форматов.
Пример пользовательского сценария:
new Cleave('.input', {
prefix: 'ID-',
blocks: [3, 3, 3],
delimiter: '-'
});
Также возможна комбинация числовых и текстовых ограничений через кастомные обработчики событий.
Cleave.js оптимизирована для работы с частыми input-событиями:
При этом производительность может зависеть от сложности маски и количества одновременно активных полей.
При вставке (paste) применяется полная переработка строки:
Это позволяет корректно обрабатывать внешние источники данных без нарушения структуры поля.