Spec-Zone.ru › Vue Router 4

Расширение RouterLink

Посмотреть бесплатный видеоурок на Vue School

Компонент RouterLink предоставляет достаточно props функционала для большинства базовых приложений, но не пытается охватить все возможные случаи использования, и вам, вероятно, придётся использовать v-slot для некоторых продвинутых случаев. В большинстве приложений среднего и большого размера стоит создать один или несколько пользовательских компонентов RouterLink для их повторного использования в приложении. Некоторые примеры — ссылки в навигационном меню, обработка внешних ссылок, добавление inactive-class, и т. д.

Давайте расширим RouterLink для обработки внешних ссылок и добавим пользовательский inactive-class в файл AppLink.vue:

<template>
  <a v-if="isExternalLink" v-bind="$attrs" :href="to" target="_blank">
    <slot />
  </a>
  <router-link
    v-else
    v-bind="$props"
    custom
    v-slot="{ isActive, href, navigate }"
  >
    <a
      v-bind="$attrs"
      :href="href"
      @click="navigate"
      :class="isActive ? activeClass : inactiveClass"
    >
      <slot />
    </a>
  </router-link>
</template>

<script>
import { RouterLink } from 'vue-router'

export default {
  name: 'AppLink',
  inheritAttrs: false,

  props: {
    // add @ts-ignore if using TypeScript
    ...RouterLink.props,
    inactiveClass: String,
  },

  computed: {
    isExternalLink() {
      return typeof this.to === 'string' && this.to.startsWith('http')
    },
  },
}
</script>

Если вы предпочитаете использовать функцию render или создавать computed свойства, вы можете использовать useLink из API композиций:

import { RouterLink, useLink } from 'vue-router'

export default {
  name: 'AppLink',

  props: {
    // add @ts-ignore if using TypeScript
    ...RouterLink.props,
    inactiveClass: String,
  },

  setup(props) {
    // `props` contains `to` and any other prop that can be passed to <router-link>
    const { navigate, href, route, isActive, isExactActive } = useLink(props)

    // profit!

    return { isExternalLink }
  },
}

На практике вы можете использовать свой компонент AppLink в разных частях приложения. Например, используя Tailwind CSS, вы можете создать компонент NavLink.vue со всеми классами:

<template>
  <AppLink
    v-bind="$attrs"
    class="inline-flex items-center px-1 pt-1 border-b-2 border-transparent text-sm font-medium leading-5 text-gray-500 focus:outline-none transition duration-150 ease-in-out hover:text-gray-700 hover:border-gray-300 focus:outline-none focus:text-gray-700 focus:border-gray-300 transition duration-150 ease-in-out"
    active-class="border-indigo-500 text-gray-900 focus:border-indigo-700"
    inactive-class="text-gray-500 hover:text-gray-700 hover:border-gray-300 focus:text-gray-700 focus:border-gray-300"
  >
    <slot />
  </AppLink>
</template>
Предложить изменения в этой странице
Ленивая загрузка маршрутов
Ошибки навигации

© 2013–present Evan You
Licensed under the MIT License.
https://next.router.vuejs.org/guide/advanced/extending-router-link

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API