В Cleave.js поведение форматирования определяется набором опций,
передаваемых при создании экземпляра. Эти опции формируют внутреннюю
конфигурацию properties, на основе которой происходит
парсинг и переформатирование ввода. В классическом сценарии библиотека
рассматривается как «инициализируемый один раз объект», однако реальные
интерфейсы требуют изменения правил форматирования уже после создания
экземпляра.
Динамическое изменение опций в Cleave.js не является единым встроенным механизмом. Вместо этого используется комбинация пересоздания экземпляра, модификации внутренних свойств и повторного применения текущего значения.
При создании экземпляра:
const cleave = new Cleave(input, {
numeral: true,
numeralThousandsGroupStyle: 'thousand',
prefix: '$'
});
формируется объект:
cleave.properties — активная конфигурацияcleave.init() — инициализация поведенияcleave.onInput() — обработка каждого изменения
значенияВся логика форматирования опирается на properties,
поэтому любые изменения опций должны либо:
propertiesНаиболее стабильный и предсказуемый способ изменения конфигурации — полное уничтожение текущего экземпляра и создание нового.
cleave.destroy();
После вызова:
const newCleave = new Cleave(input, {
numeral: true,
numeralThousandsGroupStyle: 'lakh',
prefix: '₹'
});
properties без пересозданияВнутренняя структура Cleave.js допускает прямую модификацию объекта
properties. Этот подход используется при необходимости
сохранить текущее значение и состояние поля.
cleave.properties.prefix = '€';
cleave.properties.numeralThousandsGroupStyle = 'thousand';
После изменения требуется принудительное обновление отображения:
cleave.setRawValue(cleave.getRawValue());
getRawValue() возвращает неформатированное
значениеsetRawValue() повторно прогоняет значение через новый
набор правилНаиболее стабильной зоной динамического изменения является числовое форматирование.
cleave.properties.numeralThousandsGroupStyle = 'thousand';
cleave.setRawValue(cleave.getRawValue());
Поддерживаемые варианты:
thousandlakhwancleave.properties.prefix = '$';
cleave.setRawValue(cleave.getRawValue());
При этом префикс пересчитывается при каждом рендере значения.
Для шаблонных масок (например, телефонные номера или коды) используется структура:
{
blocks: [3, 3, 4],
delimiters: ['-', '-']
}
cleave.properties.blocks = [2, 2, 2, 2];
cleave.properties.delimiters = [' ', ' ', ' '];
cleave.setRawValue(cleave.getRawValue());
В ряде интерфейсов требуется переключение между режимами:
cleave.destroy();
cleave = new Cleave(input, {
phone: true,
phoneRegionCode: 'US'
});
cleave.properties.phone = true;
cleave.properties.numeral = false;
cleave.properties.blocks = null;
cleave.properties.delimiters = null;
cleave.setRawValue(cleave.getRawValue());
Пересоздание обеспечивает более стабильное поведение при смене режима.
Любое динамическое изменение конфигурации требует сохранения текущего состояния ввода.
const raw = cleave.getRawValue();
const formatted = cleave.getFormattedValue();
cleave.setRawValue(raw);
Использование setValue() применяется реже, так как оно
повторно запускает полную цепочку обработки DOM-ввода.
Одним из сложных аспектов динамического изменения является позиция курсора.
При изменении опций:
Cleave.js автоматически пытается сохранить позицию, однако при изменении структуры маски точность сохранения снижается.
Типичный сценарий:
const pos = input.selectionStart;
cleave.properties.delimiters = ['-', '-', '-'];
cleave.setRawValue(cleave.getRawValue());
input.setSelectionRange(pos, pos);
В обёртках для React и Vue динамическое изменение опций часто реализуется декларативно.
<Cleave
value={value}
options={{
numeral: true,
prefix: currency
}}
/>
При изменении currency:
propertiesИзменение:
cleave.properties.prefix = '€';
без последующего:
cleave.setRawValue(...)
приводит к рассинхронизации отображения.
Изменение только blocks без delimiters
часто даёт неконсистентный результат, так как оба параметра
взаимосвязаны.
Одновременное включение:
numeral: true
phone: true
создаёт конфликт поведения форматирования. При динамическом переключении требуется явное отключение предыдущего режима.
В реальных приложениях динамическое изменение опций устойчиво работает в двух моделях:
properties +
setRawValue() при точечных изменениях (prefix,
group style)Гибридный подход позволяет разделять: