Динамическое изменение формата

Поведение маскирования в Cleave.js строится вокруг концепции реактивного форматирования значения: введённые данные преобразуются в соответствии с заданной конфигурацией options, а сама библиотека не требует ручного парсинга строки. При этом ключевая особенность, которая отличает её от статических масок, заключается в возможности изменять формат на лету без потери согласованности внутреннего состояния.

Динамическое изменение формата включает несколько уровней управления: изменение options, пересборка инстанса, обновление значения и корректировка поведения курсора. Каждый из этих аспектов влияет на UX и целостность данных.


Базовая модель обновления конфигурации

В Cleave.js нет полноценного встроенного реактивного механизма для глубокой смены конфигурации без пересоздания экземпляра, поэтому используются два основных подхода:

  • частичное обновление через setRawValue и изменение внутренних параметров
  • полная переинициализация инстанса с новым набором options

На практике второй подход считается более предсказуемым, особенно при смене типа форматирования (например, с телефона на валюту).


Переключение формата через пересоздание экземпляра

Наиболее устойчивый способ динамического изменения поведения — уничтожение текущего экземпляра и создание нового с обновлёнными настройками:

  • сохраняется текущее «сырое» значение
  • инстанс очищается
  • создаётся новая конфигурация
  • значение восстанавливается через повторное применение форматирования

Такой подход важен при смене структурно несовместимых масок, например:

  • телефонный номер → IBAN
  • дата → кредитная карта
  • числовой формат → текстовый с разделителями

Внутренне Cleave.js пересчитывает значение при инициализации, что обеспечивает корректное позиционирование курсора и форматирование блоков.


Обновление формата без уничтожения инстанса

В ряде сценариев требуется более мягкое изменение поведения без пересоздания:

  • изменение разделителя тысяч
  • переключение десятичного маркера
  • добавление или удаление префикса валюты
  • изменение локали отображения

В таких случаях может использоваться комбинация:

  • изменение свойств конфигурации
  • повторное применение форматирования к текущему значению

Однако важно учитывать, что внутреннее состояние курсора может стать неконсистентным при сложных изменениях шаблона.


Работа с числовыми форматами при динамике

Числовой режим в Cleave.js особенно чувствителен к изменению параметров:

  • numeral
  • numeralThousandsGroupStyle
  • numeralDecimalMark
  • numeralDecimalScale
  • prefix

При изменении этих параметров происходит перерасчёт отображаемого значения. Например, переключение между форматами:

  • 1000000 → 1 000 000
  • 1000000 → $1,000,000
  • 1000000.5 → 1 000 000.50

Если изменение происходит на лету, необходимо учитывать, что пользовательский ввод может находиться в промежуточном состоянии, и его следует сначала нормализовать до «сырого» значения.


Динамическое переключение масок ввода

Одним из наиболее частых сценариев является переключение типа ввода в зависимости от контекста формы:

  • тип документа (паспорт / водительское удостоверение)
  • тип платежного средства (карта / счёт)
  • региональная маска телефона
  • формат даты (день/месяц/год vs месяц/год)

В Cleave.js это реализуется через смену блока blocks и delimiter. При динамическом переключении важно:

  • пересчитать длины блоков
  • сбросить некорректные символы
  • сохранить валидную часть строки

При несоответствии старого значения новой маске часть данных может быть автоматически отброшена.


Сохранение значения при смене формата

При динамическом изменении конфигурации основной задачей становится сохранение максимального количества уже введённых данных. Используется подход:

  • извлечение «сырого» значения (unformatted)
  • преобразование к нейтральному виду
  • повторное применение новой маски

Cleave.js хранит форматированное представление отдельно от исходного значения, что позволяет безопасно извлекать данные перед сменой конфигурации.


Поведение курсора при изменении формата

Одной из сложных проблем динамического форматирования является позиция курсора. При изменении шаблона:

  • увеличивается или уменьшается длина строки
  • появляются разделители
  • изменяются группы символов

Это приводит к смещению caret-позиции.

В типичных реализациях Cleave.js выполняется пересчёт позиции курсора на основе:

  • разницы длины строк до и после форматирования
  • количества добавленных разделителей
  • позиции последнего валидного символа

При агрессивной смене формата возможен сброс курсора в конец строки как наиболее безопасная стратегия.


Динамическое изменение масок в рамках UI-состояний

Часто формат определяется состоянием интерфейса:

  • выбор страны → меняется телефонная маска
  • выбор валюты → меняется числовой формат
  • переключение типа ввода → меняется структура блоков

В таких сценариях Cleave.js используется как слой форматирования поверх реактивного UI, где изменение состояния вызывает:

  • пересоздание конфигурации
  • повторное применение текущего значения
  • синхронизацию отображения

Сложные сценарии комбинированных форматов

В более сложных случаях требуется сочетание нескольких форматов:

  • номер + расширение
  • дата + время
  • код страны + локальный номер
  • сумма + валюта + процент

Проблема динамического изменения здесь заключается в том, что маска становится условной. При переключении режима важно:

  • изолировать каждый формат в отдельную конфигурацию
  • избегать смешивания blocks разных структур
  • контролировать границы допустимых символов

Cleave.js не предоставляет встроенного state-machine слоя, поэтому логика переключения реализуется на уровне приложения.


Типичные ошибки при динамическом изменении

При работе с динамическими форматами часто возникают следующие проблемы:

  • потеря части введённых данных при смене blocks
  • некорректная позиция курсора после обновления
  • конфликт префиксов и числового режима
  • повторное форматирование уже отформатированного значения
  • дребезг при частом обновлении конфигурации

Особенно критичны быстрые последовательные изменения, например при автодополнении страны или валюты.


Оптимизационные стратегии

Для стабильной работы динамического форматирования в Cleave.js применяются следующие подходы:

  • дебаунс изменения конфигурации
  • хранение unformatted значения отдельно от UI
  • минимизация пересоздания инстанса
  • группировка изменений в одну транзакцию
  • контроль допустимых переходов между форматами

Эти методы уменьшают количество перерасчётов и предотвращают скачки интерфейса при вводе.


Интеграция динамических форматов в реактивные фреймворки

При использовании Cleave.js в реактивных системах (например, Vue или React) динамическое изменение формата обычно связано с эффектами наблюдения за состоянием:

  • изменение props → пересоздание инстанса
  • изменение state → обновление options
  • side-effect синхронизация значения

Ключевой принцип — разделение источника истины:

  • UI хранит форматированное значение
  • логика хранит сырое значение
  • библиотека выполняет трансформацию

Итеративная смена формата в одном поле ввода

Наиболее сложный сценарий — поле, которое в процессе ввода меняет тип:

  • сначала вводится число
  • затем определяется валюта
  • затем добавляется форматирование процентов

В Cleave.js это требует строгого контроля последовательности:

  • фиксация текущего значения
  • нормализация
  • смена конфигурации
  • повторное применение форматирования
  • корректировка курсора

Без этого переход между форматами становится нестабильным и приводит к визуальным артефактам.