refactor(vue): provide/inject для подкомпонентов заказа#204
Merged
Conversation
- ORDER_CONTEXT_KEY (Symbol), provide в OrderView, inject во вкладках с проверкой - useOrderFormatters, useOrderFieldHelpers, useOrderLogFormatters - Узкие props у вкладок; formatPrice передаётся в useOrderLogFormatters - CHANGELOG: запись под 1.9.0-beta1
biz87
approved these changes
Apr 18, 2026
Member
biz87
left a comment
There was a problem hiding this comment.
Ревью
Чистый структурный рефакторинг. Код стал значительно читаемее — OrderView похудел на ~300 строк, логика разнесена по composables с ясными зонами ответственности. Одобряю.
Что хорошо
- ✅
Symbol('ms3.orderContext')— правильный подход, исключает коллизии строковых ключей - ✅ Pure composable (
useOrderFormatters) отделён от stateful (useOrderFieldHelpers) — правильная границ - ✅ Guard pattern с
throw Errorпри отсутствии inject — fail-fast, понятная диагностика - ✅ Удалён
eslint-disable vue/no-mutating-props— теперьorderприходит через inject как ref, а не как prop, что корректнее - ✅ Props вкладок сокращены до данных —
orderFieldsBySection,products,logsи т.д. - ✅
useOrderLogFormatters({ formatPrice })— DI через параметр, не создаёт лишний экземпляр
Мелкие замечания (не блокеры)
1. Двойной console.error + throw
if (import.meta.env.DEV && !orderCtx) {
console.error('[OrderInfoTab] Missing inject...')
}
if (!orderCtx) {
throw new Error('[OrderInfoTab] orderContext is required...')
}throw уже покажет ошибку в консоли. DEV-check перед ним избыточен. Но не критично — можно оставить для наглядности в devtools.
2. Inconsistency: formatters через inject vs через composable
OrderInfoTab/OrderAddressTabполучаютformatDate,formatPriceиз inject (контекст OrderView)OrderHistoryTab/OrderProductsTabсоздают свойuseOrderFormatters()
Функционально нет разницы (pure functions), но подход разный. Если это осознанный выбор (вкладки с inject зависят от контекста, а history/products могут работать автономно) — ок. Если нет — стоит унифицировать.
LGTM 👍
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Описание
Реализует issue #196: вместо длинной передачи функций через props между
OrderViewи вкладками используется идиоматичный Vue 3 паттерн.provide(ORDER_CONTEXT_KEY)— общий контекст (state, действия, хелперы полей изuseOrderFieldHelpers), ключ —Symbol('ms3.orderContext')для исключения коллизий.useOrderFormatters,useOrderFieldHelpers,useOrderLogFormatters(в логах при необходимости передаётсяformatPriceиз первого composable).orderFieldsBySection,addressFieldsBySection,products,logsи т.д.); послеinject— явная проверка контекста до деструктуризации.Поведение UI не менялось намеренно — это структурный рефакторинг.
Тип изменений
Связанные Issues
Closes #196
Как это было протестировано?
Конфигурация тестирования:
Для Vue:
npm run lintиnpm run buildвvueManagerвыполняются без ошибок.Скриншоты (если применимо)
Не требуются (без визуальных изменений).
Чеклист
Дополнительные заметки
Соответствует предложенному плану в issue: composables для утилит, provide/inject для зависимостей вглубь дерева, сокращение props до данных вкладки.