К списку уроков

Урок 3. Advanced components

Онлайн и в онлайн, 4 ноября (вторник), 15:15

Изучим v-model, emits, slots, nextTick, provide/inject, :is

В этом видеоуроке подробно рассматривается работа с продвинутыми компонентами в Vue.js. Основное внимание уделено таким темам, как пробрасывание событий (event emitting), директива v-model и её тонкости, работа со слотами для гибкого вкладывания контента, использование утилиты nextTick для синхронизации реактивных обновлений, принципы provide/inject для передачи данных между компонентами на разных уровнях и мета-компоненты с динамическим выбором отображаемого компонента. Также происходит написание чата с базовой функциональностью — создание компонентов сообщения, чат-контента и поля ввода с кнопкой отправки. Важным аспектом является демонстрация использования OpenAPI tools с автоматической типизацией запроса и ответа для связи с бэкендом. Материал актуален для разработчиков, желающих глубже понять внутренние механизмы Vue 3, повысить качество архитектуры и научиться создавать масштабируемые и типизированные UI-компоненты.

Для кого этот урок:

- Для разработчиков, уже знакомых с базовым Vue.js, желающих освоить продвинутые возможности

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

- Для тех, кто интересуется автоматической генерацией типизации API и интеграцией с бэкендом

- Для изучающих принципы реактивности и эффективную работу с DOM и интерфейсом

Хронологическое резюме

- 00:00–00:40: Введение в тему урока — продвинутые компоненты Vue, обсуждение реативности и обратная связь по предыдущему материалу.

- 00:40–03:45: Объяснение пробрасывания событий (emits) в компонентах, использование defineEmits с типами, работа с двусторонней привязкой v-model и синтаксическим сахаром для упрощения кода.

- 03:45–07:20: Примеры использования множества моделей (v-model) в одном компоненте, типизация пропсов и событий, обсуждение преимуществ лаконичной реализации через defineModel.

- 07:20–08:48: Вопросы по работе стандартных HTML-тегов с v-model, подтверждение их поддержки и плавный переход к практической части создания чата.

- 08:48–20:52: Создание компонентов чата: чат-импут с двусторонней привязкой, стилизация элементов, обработка кнопки отправки, подробный разбор CSS-стилей, динамическое управление размерами и расположением элементов ввода и сообщений.

- 20:52–24:45: Демонстрация обработки событий отправки сообщения, отладка работы компонента, первые шаги по интеграции с backend через моковые данные.

- 24:45–29:30: Введение в OpenAPI tools и Swagger: демонстрация генерации типизированных API-интерфейсов из спецификации, преимущества автоматизации, работа с json-схемами API, интеграция с TypeScript для точной типизации данных.

- 29:30–33:40: Работа со слотами в Vue: передача динамического контента внутрь компонентов, отличие слотов от props, пример с кастомной кнопкой и передача иконок или текста через слоты, примеры именованных слотов.

- 33:40–35:50: Объяснение утилиты nextTick для ожидания следующего обновления DOM при работе с реактивностью и сложными вычислениями, особенности поведения реактивных значений при асинхронном обновлении.

- 35:50–38:40: Более глубокий разбор nextTick, примеры проблем в React и особенности Vue, практика с примером компонента Input, демонстрация использования готовых UI-библиотек (например, Quasar) с примерами слотов.

- 38:40–40:55: Размышления о целесообразности использования UI-китов в проектах, советы писать собственные компоненты для лучшего понимания.

- 40:55–44:45: Продолжение работы с OpenAPI tools, демонстрация структуры сгенерированного кода, объяснение автоматической типизации и обновляемости схемы данных.

- 44:45–49:55: Обсуждение проблемы пробрасывания пропсов через несколько уровней, решение через provide/inject — передача данных из корня в глубокие дочерние компоненты без лишнего boilerplate.

- 49:55–54:15: Практический пример provide/inject в проекте для глобального состояния с event диалогами, применение reactive/ref, использование hook для повторного доступа к provide значению.

- 54:15–57:00: Ограничения и особенности provide/inject — область видимости иерархии компонентов, рекомендации по размещению в корне приложения, реальный кейс с пуш-уведомлениями.

- 57:00–58:35: Обзор мета-компонентов с параметром is для динамического выбора внутрь какого компонента рендерить содержимое, пример с формами многоступенчатой регистрации.

- 58:35–01:10:40: Практическая работа — создание chat message компонента с пропсами, типизацией, условным рендерингом текста и изображений, стилизация сообщений (отображение по левому/правому краю в зависимости от статуса автора).

- 01:10:40–01:18:10: Исправление багов с CSS-классами, детальная настройка позиционирования сообщений в чате, работа с max-width, flex-выравниванием, корректировка стилей для чата с прокруткой.

- 01:18:10–01:20:50: Добавление отступов, оформление дизайна сообщений с color и border-radius, базовые практики UX для чата, скроллинг контента, подготовка к работе с реальными сообщениями.

- 01:20:50–01:24:15: Итоги занятия, обратная связь, домашнее задание по разбору OpenAPI tools, рекомендации по мокауту данных и подготовке к дальнейшей работе с бэкендом. Анонс следующих занятий: работа с роутером, teleport, suspense и loading.

Ключевые моменты

- ⚙️ Пробрасывание событий через defineEmits с указанием типов типизировано и упрощает коммуникацию между дочерними и родительскими компонентами.

- 🔄 v-model с defineModel позволяет легко реализовать двустороннее связывание без лишнего кода, упрощая обновление и передачу данных.

- 🪟 Слоты для гибкой вставки контента — мощный инструмент в Vue для переиспользования компонентов с кастомным содержимым, в том числе именованные слоты.

- ⏳ nextTick гарантирует обновление DOM после реактивных изменений, что особенно важно при работе с асинхронными вычислениями или сторонними библиотеками.

- 🔗 provide/inject избавляет от сложного пробрасывания пропсов через многоуровневую вложенность, создавая удобное глобальное или локально-иерархическое хранение данных.

- 💼 Мета-компоненты с параметром is позволяют динамически подставлять разные компоненты, что удобно для многоступенчатых форм или других UI-паттернов.

- 📄 Автоматическая генерация типизированных API-интерфейсов из OpenAPI/Swagger значительно упрощает поддержку и синхронизацию фронтенда с бэкендом.

- 🛠 Практическая разработка чата с типизацией, CSS-стилями и использованием Vue-концепций наглядно демонстрирует применение изученного материала.

Часто задаваемые вопросы (FAQ)

1. Что такое defineEmits и зачем он нужен?

defineEmits — это функция Vue 3 Composition API, которая объявляет события, которые компонент может эмитить, вместе с их типами. Это обеспечивает типовую проверку и удобство использования событий по всему приложению.

2. Как работает директива v-model с defineModel?

Она упрощает двустороннюю привязку данных в компоненте, автоматически создает props и эмиты для обновления значения без лишнего кода. Это синтаксический сахар поверх defineProps и defineEmits.

3. Когда использовать provide/inject вместо проброса пропсов?

Если нужно передать данные через несколько уровней вложенности компонентов, чтобы избежать длинной цепочки передачи через каждый промежуточный компонент, лучше использовать provide/inject. Это повышает читаемость и уменьшает boilerplate.

4. Для чего нужен nextTick и когда его применять?

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

5. Что такое слоты и чем они отличаются от props?

Слот — это место в компоненте, куда можно вставить произвольный контент (текст, HTML, другие компоненты). В отличие от props, которые передают данные, слоты позволяют передавать структуру или UI-контент, увеличивая гибкость.

Заключение

Видео подробно раскрывает современные и эффективные способы создания и управления Vue-компонентами: от базовых событий и двусторонней привязки до сложных архитектурных решений с provide/inject и динамическими мета-компонентами. Особенность урока — акцент на практическом применении с разборами реального чата, а также интеграция с backend посредством OpenAPI tools, что обеспечивает типизацию и удобство разработки.

Рекомендуемые действия:

- Изучить и попрактиковаться с defineEmits и defineModel для удобной работы с пропсами и событиями.

- Освоить работу со слотами для создания гибких и переиспользуемых компонентов.

- Применять provide/inject в проектах для сокращения избыточной передачи данных.

- Использовать nextTick при работе с асинхронностью реактивности для правильной синхронизации UI.

- Настроить автоматическую генерацию типизации API через OpenAPI tools для упрощения взаимодействия с backend.

- Написать собственный UI-компонентный набор для глубокого понимания архитектуры и принципов Vue.

Такой подход обеспечит устойчивость, читаемость и масштабируемость вашего фронтенд-кода, а также облегчит работу с backend и улучшит пользовательский интерфейс.

Ссылки на материаллы.

Презентация тык.

v-model – https://ru.vuejs.org/guide/components/v-model.html

emits – https://ru.vuejs.org/api/options-state.html#emits

nextTick() - https://ru.vuejs.org/api/general.html#nexttick

slots – https://ru.vuejs.org/guide/components/slots.html

provide/inject – https://ru.vuejs.org/guide/components/provide-inject.html

component – https://ru.vuejs.org/api/built-in-special-elements.html#component