Библиотека распространяется через npm и CDN и может использоваться как в классическом JavaScript, так и в современных фреймворках.
npm install cleave.js
import Cleave fr om 'cleave.js';
import 'cleave.js/dist/addons/cleave-phone.i18n';
<script src="https://cdn.jsdelivr.net/npm/cleave.js@1.6.0/dist/cleave.min.js"></script>
Cleave.js работает поверх обычного <input> и
форматирует ввод в реальном времени.
<input type="text" id="input" />
const cleave = new Cleave('#input', {
delimiters: ['-'],
blocks: [3, 3, 3],
uppercase: true
});
Одна из самых популярных задач — форматирование телефонов.
new Cleave('#phone', {
phone: true,
phoneRegionCode: 'US'
});
Для других регионов используется подключаемый модуль:
import 'cleave.js/dist/addons/cleave-phone.ru';
new Cleave('#phone', {
phone: true,
phoneRegionCode: 'RU'
});
Cleave.js автоматически определяет тип карты и применяет соответствующие блоки.
new Cleave('#card', {
creditCard: true
});
new Cleave('#card', {
creditCard: true,
onCreditCardTypeChanged: function (type) {
console.log('Card type:', type);
}
});
new Cleave('#date', {
date: true,
datePattern: ['d', 'm', 'Y']
});
d-m-Ym-d-YY-m-dCleave.js поддерживает форматирование чисел с разделителями тысяч и десятичной частью.
new Cleave('#number', {
numeral: true,
numeralThousandsGroupStyle: 'thousand'
});
new Cleave('#number', {
numeral: true,
numeralDecimalMark: '.',
delimiter: ',',
numeralDecimalScale: 2
});
Механизм блоков лежит в основе гибкого форматирования.
new Cleave('#code', {
blocks: [4, 4, 4, 4],
delimiters: [' ', ' ', ' ']
});
Пример использования:
Экземпляр можно обновлять без пересоздания.
const cleave = new Cleave('#input', {
numeral: true
});
cleave.setRawValue('12345');
cleave.properties.numeral = false;
cleave.init();
Cleave.js хранит два типа значений:
cleave.getRawValue();
cleave.setRawValue('999888777');
new Cleave('#input', {
numeral: true,
onValueChanged: function (e) {
console.log(e.target.value);
console.log(e.target.rawValue);
}
});
value — отформатированное значениеrawValue — чистое значениеtarget — DOM-элементcleave.destroy();
После вызова:
const inputs = document.querySelectorAll('.phone');
const instances = Array.from(inputs).map(input => {
return new Cleave(input, {
phone: true,
phoneRegionCode: 'US'
});
});
Cleave.js не является валидатором, но может ограничивать ввод через форматирование.
Пример ограничения на цифры:
new Cleave('#code', {
numeral: true,
numeralPositiveOnly: true
});
new Cleave('#custom', {
blocks: [2, 2, 2, 2],
delimiters: ['-', '-', '-'],
numericOnly: true
});
Применения:
import React, { useEffect, useRef } from 'react';
import Cleave from 'cleave.js';
function PhoneInput() {
const ref = useRef(null);
useEffect(() => {
const cleave = new Cleave(ref.current, {
phone: true,
phoneRegionCode: 'US'
});
return () => cleave.destroy();
}, []);
return <input ref={ref} />;
}
const form = document.querySelector('form');
form.addEventListener('submit', (e) => {
const cleave = new Cleave('#input', { numeral: true });
console.log(cleave.getRawValue());
});
При работе с множеством полей форматирования важно учитывать:
destroy/initCleave.js работает только на уровне представления ввода и не:
Форматирование всегда отделено от бизнес-логики приложения.
При вставке значения:
new Cleave('#input', {
blocks: [3, 3, 3]
});
new Cleave('#input', {
numeral: true,
onValueChanged: function(e) {
if (e.target.rawValue.length > 10) {
console.log('Lim it reached');
}
}
});
Некоторые сценарии требуют комбинированного подхода:
new Cleave('#input', {
numeral: true,
numeralThousandsGroupStyle: 'thousand',
prefix: '$'
});
Cleave.js пересчитывает блоки динамически: