Как ответить
Да, я использовал Vue.js в своём последнем проекте — это был внутренний дашборд для отдела логистики. Взял Vue 3 Composition API, потому что проект новый и не было legacy, а Typescript добавил для типизации.
Из конкретных фич: настраивал Vue Router с ленивой загрузкой для трёх разделов (заказы, поставщики, аналитика). Один роут был динамический: /orders/:id. Стейт-менеджмент — Pinia. Использовал стор для общих данных по заказам и для фильтров, которые тянулись через URL-параметры. Для работы с API — axios с интерсепторами для обработки 401 ошибок и рефреша токена.
Из проблем, с которыми столкнулся:
- Реактивность: приходилось внимательно следить за глубокой реактивностью. Наткнулся на известный кейс с
reactive()и массивами — если пересоздавать объект целиком, а не черезpush, реактивность ломалась. Потом перешёл наrefдля примитивов и вложенных массивов. - Teleport: когда делал модалку для подтверждения действий, использовал
Teleportк<body>. Это было удобно для z-index, но словил неочевидный баг с анимациями — пришлось добавитьtransitionна сам контент внутри телепорта. - Слоты: сделал компонент таблицы, где через слоты прокидывал кастомные ячейки для статусов. Сначала намудрил со scoped slots, но потом упростил до обычных именованных слотов с параметрами.
Что касается тестов — писал unit-тесты с Vitest для сторов Pinia и утилит. Для компонентов использовал Vue Test Utils, тестировал только бизнес-логику: рендер по условию и вызов эмитов. Снэпшот-тесты не использовал — они больше ломались, чем помогали.
Производительность: в дашборде была таблица на 500+ строк с пагинацией из 50 строк. Но на одном экране нужно было отображать агрегированные данные сразу по всей таблице — пришлось считать сумму и среднее на бэкенде, а не на фронте, чтобы не тормозить. Использовал v-memo для статичных данных в списке, хотя разница была, скорее, в микрооптимизации.
В целом Vue 3 с Composition API показался логичнее Options API для средних проектов — нет путаницы с methods и computed, код группируется по фичам, а не по типам.