Cleave.js строится вокруг идеи декларативной конфигурации: поведение форматирования входного значения определяется набором параметров, которые передаются при инициализации экземпляра или через обёртки фреймворков. Эти параметры контролируют тип маски, правила разделения, ограничения ввода и дополнительные трансформации данных.
Конфигурация может задаваться в двух основных формах:
CleaveВ классическом JavaScript-использовании Cleave.js принимает объект конфигурации вторым аргументом конструктора.
const cleave = new Cleave('.input-phone', {
phone: true,
phoneRegionCode: 'RU'
});
Объект опций определяет режим работы:
phone — включает телефонное форматированиеdate — активирует формат датыnumeral — числовое форматированиеcreditCard — режим банковской картыblocks — кастомное разбиение строкиКаждый режим накладывает собственные правила обработки строки, и комбинация параметров должна соответствовать выбранному типу.
При инициализации Cleave.js применяется фиксированный порядок приоритета параметров:
Это означает, что передача параметров всегда перекрывает встроенные настройки, но не может выйти за рамки логики выбранного режима.
Пример переопределения поведения:
new Cleave('.input-card', {
creditCard: true,
onCreditCardTypeChanged: function (type) {
console.log(type);
}
});
Режим numeral использует расширенный набор
параметров:
new Cleave('.input-number', {
numeral: true,
numeralThousandsGroupStyle: 'thousand',
numeralDecimalMark: ',',
delimiter: ' '
});
Ключевые параметры:
numeralThousandsGroupStyle — стиль группировки
(thousand, lakh, wan)numeralDecimalMark — символ десятичного
разделителяdelimiter — символ группировки разрядовnumeralDecimalScale — количество знаков после
запятойИзменение любого параметра приводит к пересборке строки при каждом вводе, без необходимости дополнительной логики.
Режим date использует структурированные блоки:
new Cleave('.input-date', {
date: true,
datePattern: ['d', 'm', 'Y'],
delimiter: '.'
});
Основные параметры:
datePattern — массив сегментов датыdelimiter — разделитель между сегментамиdateMin и dateMax — ограничения
диапазонаСтруктура datePattern определяет порядок и длину блоков,
например:
['Y', 'm', 'd'] → ISO-подобный формат['d', 'm', 'Y'] → европейский форматНаиболее универсальный механизм — blocks, позволяющий
полностью управлять разбиением строки.
new Cleave('.input-custom', {
blocks: [4, 4, 4, 4],
delimiter: '-'
});
Поведение определяется массивом:
delimiter вставляется между сегментамиПрименение:
В React используется компонент-обёртка, где конфигурация передаётся через props.
import Cleave from 'cleave.js/react';
function PhoneInput() {
return (
<Cleave
options={{
phone: true,
phoneRegionCode: 'RU'
}}
/>
);
}
Здесь объект options полностью соответствует нативному
API Cleave.js, но передаётся декларативно через props.
В React-реализации существует важное разделение:
Пример:
<Cleave
value={value}
onCha nge={handleChange}
options={{
numeral: true,
numeralDecimalScale: 2
}}
/>
Особенности:
value управляется ReactonChange пробрасывает событие измененияoptions не участвуют в React lifecycle напрямуюИзменение props options приводит к пересозданию
внутренней конфигурации.
const [region, setRegion] = useState('RU');
<Cleave
options={{
phone: true,
phoneRegionCode: region
}}
/>
При изменении region происходит:
Это важно учитывать при частых обновлениях состояния, чтобы избежать лишних пересборок.
Во Vue конфигурация также задаётся через props компонента:
<cleave
:options="{
numeral: true,
numeralThousandsGroupStyle: 'thousand'
}"
/>
Особенность Vue-интеграции:
optionsВ некоторых случаях изменение опций требует полного пересоздания экземпляра Cleave.js. Это происходит при изменении:
phone → numeral)blocksdatePattern)В таких случаях библиотека уничтожает текущий инстанс и создаёт новый.
cleave.destroy();
cleave = new Cleave(element, newOptions);
Каждая опция имеет значение по умолчанию. При отсутствии явного указания используются встроенные настройки:
Переопределение работает полностью поверх этих значений:
{
numeral: true,
delimiter: ' '
}
Даже если внутренний пресет устанавливает другой разделитель, внешний параметр имеет приоритет.
Некоторые режимы допускают расширенную комбинацию параметров:
new Cleave('.input', {
numeral: true,
numeralThousandsGroupStyle: 'thousand',
prefix: '₽ ',
rawValueTrimPrefix: true
});
Использование:
prefix добавляет статический префиксrawValueTrimPrefix управляет извлечением «чистого»
значенияnumeral активирует числовую логикуКомбинации применяются последовательно, что позволяет строить сложные маски без дополнительного кода.
Некоторые опции принимают функции, позволяющие реагировать на изменения состояния:
new Cleave('.input-card', {
creditCard: true,
onCreditCardTypeChanged: function (type) {
console.log(type);
}
});
Колбэки используются для:
Функции вызываются синхронно при каждом обновлении значения, что важно учитывать при тяжёлых вычислениях внутри обработчиков.
Конфигурации можно выносить в отдельные объекты:
const phoneConfig = {
phone: true,
phoneRegionCode: 'RU'
};
new Cleave('.input1', phoneConfig);
new Cleave('.input2', phoneConfig);
Это обеспечивает:
При необходимости объект можно расширять:
const extended = {
...phoneConfig,
delimiter: ' '
};
Если одновременно заданы несовместимые параметры, Cleave.js применяет приоритет режима:
{
phone: true,
numeral: true
}
В таком случае активируется только один режим (обычно последний интерпретируемый), а остальные игнорируются. Конфигурация должна быть однозначной.