# Компонент AppLink - Полная документация ## Назначение компонента `AppLink` - универсальный компонент для работы со ссылками в приложении. Автоматически определяет тип ссылки (внутренняя/внешняя) и использует соответствующий компонент (`router-link` для внутренних маршрутов, `a` для внешних URL). Обеспечивает единообразие поведения, безопасности и стилизации всех ссылок в приложении. ## Импорт и регистрация ```coffee # В основном файле приложения (app/temp.coffee) components: 'app-link': require 'app/shared/AppLink' ``` ## Базовое использование ### 1. Простая внутренняя ссылка ```pug app-link(to="/about") О нас ``` ### 2. Внешняя ссылка ```pug app-link(to="https://example.com") Внешний сайт ``` ## Полный список props ### `to` (обязательный) - **Тип:** `String | Object` - **Описание:** Назначение ссылки - **Примеры:** ```pug //- Строковый путь app-link(to="/events") //- Объект маршрута Vue Router app-link(:to="{ name: 'EventDetail', params: { id: event._id } }") //- Внешний URL app-link(to="https://facebook.com/borbad") //- Email ссылка app-link(to="mailto:info@borbad.s5l.ru") //- Телефонная ссылка app-link(to="tel:+992371234567") ``` ### `href` (опциональный) - **Тип:** `String` - **По умолчанию:** `''` - **Описание:** Альтернативный способ указания внешнего URL - **Пример:** ```pug app-link(href="https://example.com" to="/fallback") Ссылка ``` ### `target` (опциональный) - **Тип:** `String` - **По умолчанию:** `'_self'` - **Допустимые значения:** `'_self'`, `'_blank'`, `'_parent'`, `'_top'` - **Описание:** Целевое окно для ссылки - **Пример:** ```pug app-link(to="https://example.com" target="_blank") Открыть в новом окне ``` ### `rel` (опциональный) - **Тип:** `String` - **По умолчанию:** `''` - **Описание:** Атрибут rel для внешних ссылок - **Примечание:** Для `target="_blank"` автоматически добавляется `noopener noreferrer` - **Пример:** ```pug app-link(to="https://example.com" rel="nofollow") Ссылка nofollow ``` ### `class` (опциональный) - **Тип:** `String | Object | Array` - **По умолчанию:** `''` - **Описание:** CSS классы для стилизации - **Примеры:** ```pug //- Строка app-link(to="/" class="text-blue-600 hover:text-blue-800") //- Объект app-link(to="/" :class="{ 'font-bold': isActive }") //- Массив app-link(to="/" :class="['text-blue-600', 'hover:text-blue-800']") ``` ### `activeClass` (опциональный) - **Тип:** `String` - **По умолчанию:** `'app-link--active'` - **Описание:** CSS класс для активного состояния (только для внутренних ссылок) - **Пример:** ```pug app-link(to="/events" active-class="bg-blue-100 text-blue-800") ``` ### `exact` (опциональный) - **Тип:** `Boolean` - **По умолчанию:** `false` - **Описание:** Точное совпадение для активного класса - **Пример:** ```pug app-link(to="/" exact) Главная ``` ## События (Events) ### `@click` - **Описание:** Событие клика по ссылке - **Payload:** `Event` объект - **Пример:** ```pug app-link(to="/events" @click="handleEventClick") ``` ## Слоты (Slots) ### `[body]` (основной слот) - **Описание:** Содержимое ссылки - **Примеры:** ```pug //- Текстовое содержимое app-link(to="/events") Все мероприятия //- HTML содержимое app-link(to="/events") div(class="flex items-center") span Мероприятия icon(name="arrow-right") //- Компоненты внутри app-link(to="/cart") cart-icon span Корзина badge(:count="cartCount") ``` ## Стили и CSS классы ### Базовые классы - `.app-link` - основной класс компонента - `.app-link--active` - класс активного состояния (по умолчанию) ### Модификаторы размера ```pug app-link(to="/" class="app-link--sm") Маленькая app-link(to="/" class="app-link--md") Средняя app-link(to="/" class="app-link--lg") Большая ``` ### Варианты стилей ```pug //- Основной стиль app-link(to="/" class="app-link--primary") Основная //- Вторичный стиль app-link(to="/" class="app-link--secondary") Вторичная //- Текстовый стиль app-link(to="/" class="app-link--text") Текстовая //- С иконкой внешней ссылки app-link(to="https://example.com" class="app-link--external") Внешняя ``` ### Утилитарные классы ```pug //- Без подчеркивания app-link(to="/" class="no-underline") Без подчеркивания //- Подчеркивание при hover app-link(to="/" class="underline-on-hover") Подчеркивание при наведении ``` ## Примеры использования в различных сценариях ### 1. Навигационное меню ```pug nav(class="flex space-x-6") app-link( to="/" exact active-class="text-blue-600 border-blue-600" class="pb-2 border-b-2 border-transparent transition-colors" ) Главная app-link( to="/events" active-class="text-blue-600 border-blue-600" class="pb-2 border-b-2 border-transparent transition-colors" ) Мероприятия app-link( to="/blog" active-class="text-blue-600 border-blue-600" class="pb-2 border-b-2 border-transparent transition-colors" ) Блог ``` ### 2. Карточки мероприятий ```pug div( v-for="event in events" :key="event._id" class="bg-white rounded-lg shadow-md overflow-hidden" ) app-link(:to="'/events/' + event._id") img(:src="event.image" :alt="event.title" class="w-full h-48 object-cover") div(class="p-4") h3(class="text-lg font-semibold mb-2") {{ event.title }} p(class="text-gray-600 mb-2") {{ event.event_data.location }} p(class="text-gray-500 text-sm") {{ formatDate(event.event_data.event_date) }} ``` ### 3. Социальные ссылки ```pug div(class="flex space-x-4") app-link( to="https://facebook.com/borbad" target="_blank" rel="noopener noreferrer" class="app-link--external text-gray-600 hover:text-blue-600" ) icon(name="facebook" class="w-6 h-6") app-link( to="https://instagram.com/borbad" target="_blank" rel="noopener noreferrer" class="app-link--external text-gray-600 hover:text-pink-600" ) icon(name="instagram" class="w-6 h-6") ``` ### 4. Кнопки действия ```pug div(class="flex space-x-4") app-link( to="/events" class="app-link--primary app-link--lg" ) Смотреть мероприятия app-link( to="/contacts" class="app-link--secondary app-link--lg" ) Связаться с нами ``` ### 5. Ссылки с параметрами запроса ```pug app-link( :to="{ path: '/events', query: { category: 'music', date: '2024-03' } }" class="text-blue-600 hover:text-blue-800" ) Музыкальные мероприятия марта ``` ### 6. Ссылки с именованными маршрутами ```pug app-link( :to="{ name: 'BlogPost', params: { id: post._id, slug: post.slug } }" class="block p-6 bg-white rounded-lg shadow hover:shadow-md transition-shadow" ) h3(class="text-xl font-semibold mb-2") {{ post.title }} p(class="text-gray-600") {{ post.excerpt }} ``` ### 7. Email и телефонные ссылки ```pug div(class="space-y-2") app-link( to="mailto:info@borbad.s5l.ru" class="text-blue-600 hover:text-blue-800" ) info@borbad.s5l.ru app-link( to="tel:+992371234567" class="text-blue-600 hover:text-blue-800" ) +992 37 123-45-67 ``` ## Особенности работы ### Автоматическое определение типа ссылки ```coffee # Внутренние ссылки '/about' '/events/123' { name: 'Home' } { path: '/blog', query: { category: 'news' } } # Внешние ссылки 'https://example.com' '//cdn.example.com/image.jpg' 'mailto:test@example.com' 'tel:+1234567890' 'ftp://example.com' '#section' ``` ### Безопасность внешних ссылок - Автоматическое добавление `rel="noopener noreferrer"` для `target="_blank"` - Защита от уязвимостей типа tabnabbing - Валидация URL ### Интеграция с аналитикой ```coffee # В обработчиках событий handleExternalClick: (event) -> EventBus.emit('external_link_clicked', { url: @normalizedHref target: @target }) handleInternalClick: (event) -> EventBus.emit('internal_link_clicked', { to: @normalizedTo route: @$route }) ``` ## Кастомизация ### Создание собственных вариантов стилей ```styl // В глобальных стилях .app-link--custom @apply bg-gradient-to-r from-purple-500 to-pink-500 text-white &:hover @apply from-purple-600 to-pink-600 &.app-link--active @apply from-purple-700 to-pink-700 ``` ### Расширение функциональности ```coffee # Создание производного компонента CustomAppLink = name: 'CustomAppLink' extends: require 'app/shared/AppLink' methods: handleExternalClick: (event) -> # Дополнительная логика analytics.track('external_link_click', { url: @normalizedHref }) # Вызов родительского метода @$super.handleExternalClick(event) ``` ## Отладка и разработка ### Проверка типа ссылки ```pug app-link( :to="linkUrl" :class="{ 'border-green-500': $el.isRouterLink, 'border-red-500': $el.isExternalLink }" ) Ссылка ``` ### Логирование событий ```coffee # В основном приложении EventBus.on 'external_link_clicked', (data) -> debug.log "Внешняя ссылка: "+data.url EventBus.on 'internal_link_clicked', (data) -> debug.log "Внутренняя ссылка: "+JSON.stringify(data.to) ``` ## Best Practices ### 1. Всегда используйте AppLink вместо прямых тегов ```pug //- Правильно app-link(to="/about") О нас //- Неправильно a(href="/about") О нас router-link(to="/about") О нас ``` ### 2. Используйте правильные target и rel для внешних ссылок ```pug //- Правильно app-link(to="https://example.com" target="_blank") Ссылка //- Опасно (без rel) app-link(to="https://example.com" target="_blank" rel="") Ссылка ``` ### 3. Используйте объекты маршрутов для сложных ссылок ```pug //- Правильно app-link(:to="{ name: 'EventDetail', params: { id: event._id } }") {{ event.title }} //- Менее предпочтительно app-link(:to="'/events/' + event._id") {{ event.title }} ``` ### 4. Сохраняйте семантику контента в слоте ```pug //- Правильно app-link(to="/events") span Мероприятия icon(name="arrow-right") //- Неправильно (не семантично) app-link(to="/events") > Мероприятия > ``` Компонент AppLink обеспечивает единообразное, безопасное и удобное использование ссылок во всем приложении, автоматически обрабатывая различные сценарии и предоставляя богатые возможности для кастомизации.