Контекст
В PR #55 B24DateTimePicker использует «ручную» комбинацию ref + watch + emits('update:modelValue') вместо современного defineModel() (Vue 3.4+). Это исторически сложилось из паттерна старых компонентов библиотеки.
Минусы текущего подхода:
- При внешнем обновлении
modelValue во время открытого попапа watch сразу перезаписывает internalValue, что может прервать пользовательский флоу (особенно после step.value = 'time').
defineModel({ local: true }) решает это автоматически.
Что нужно сделать
- Пройтись по всем компонентам с
modelValue в src/runtime/components/*.vue и оценить, какие можно мигрировать на defineModel без breaking changes.
- Проверить совместимость с
useComponentProps и useFormField.
- Сделать одним PR с миграцией пачкой (например 10–15 компонентов за раз).
- Снапшот-тесты должны остаться зелёными.
Definition of Done
- Все компоненты с
modelValue используют defineModel (или явно задокументировано, почему нет).
- Tests + snapshots зелёные.
vue-tsc зелёный.
Приоритет: P2 — внутренняя чистка, не блокер.
Следствие ревью PR #55.
Контекст
В PR #55
B24DateTimePickerиспользует «ручную» комбинациюref + watch + emits('update:modelValue')вместо современногоdefineModel()(Vue 3.4+). Это исторически сложилось из паттерна старых компонентов библиотеки.Минусы текущего подхода:
modelValueво время открытого попапаwatchсразу перезаписываетinternalValue, что может прервать пользовательский флоу (особенно послеstep.value = 'time').defineModel({ local: true })решает это автоматически.Что нужно сделать
modelValueвsrc/runtime/components/*.vueи оценить, какие можно мигрировать наdefineModelбез breaking changes.useComponentPropsиuseFormField.Definition of Done
modelValueиспользуютdefineModel(или явно задокументировано, почему нет).vue-tscзелёный.Приоритет: P2 — внутренняя чистка, не блокер.
Следствие ревью PR #55.