Lien de menu latéral - DsfrSideMenuLink
🌟 Introduction
Le lien de menu latéral est un composant qui crée automatiquement un lien cliquable dans un menu latéral. Il gère les liens externes et internes avec le routeur Vue.
Le composant DsfrSideMenuLink crée dynamiquement un élément <a> pour les liens externes ou un <RouterLink> pour les liens internes, avec la classe fr-sidemenu__link et support de l'état actif.
Important
Ce composant NE devrait PAS être utilisé directement, il est utilisé en interne par DsfrSideMenuList
📐 Structure
Le lien de menu latéral crée dynamiquement :
- un élément
<a>pour les liens externes (commençant parhttp) - un
<RouterLink>pour les liens internes avec gestion automatique du routeur Vue - la classe CSS
fr-sidemenu__linkpour le styling DSFR - l'attribut
aria-current="page"si le lien est actif
🛠️ Props
| nom | type | défaut | obligatoire | description |
|---|---|---|---|---|
active | boolean | false | Si le lien représente la page active | |
to | string | '' | ✅ | URL ou route de destination |
📡 Événements
DsfrSideMenuLink ne déclenche pas d'événements.
🧩 Slots
| nom | description |
|---|---|
default | Texte affiché du lien |
📝 Exemples
Exemple d'utilisation de DsfrSideMenuLink dans un élément de menu :
vue
<template>
<DsfrSideMenuListItem>
<DsfrSideMenuLink
to="/"
active
>
Accueil
</DsfrSideMenuLink>
</DsfrSideMenuListItem>
<DsfrSideMenuListItem>
<DsfrSideMenuLink to="https://www.service-public.fr">
Service Public
</DsfrSideMenuLink>
</DsfrSideMenuListItem>
</template>⚙️ Code source du composant
vue
<script lang="ts" setup>
import type { DsfrSideMenuLinkProps } from './DsfrSideMenu.types'
import { computed } from 'vue'
export type { DsfrSideMenuLinkProps }
const props = withDefaults(defineProps<DsfrSideMenuLinkProps>(), {
to: '',
})
defineSlots<{
/** Slot par défaut pour le contenu d'une liste du menu latéral */
default?: () => any
}>()
const isExternalLink = computed(() => {
return typeof props.to === 'string' && props.to.startsWith('http')
})
const is = computed(() => {
return isExternalLink.value ? 'a' : 'RouterLink'
})
const linkProps = computed(() => {
return { [isExternalLink.value ? 'href' : 'to']: props.to }
})
</script>
<template>
<component
:is="is"
:aria-current="active ? 'page' : undefined"
class="fr-sidemenu__link"
v-bind="linkProps"
>
<slot />
</component>
</template>ts
import type { RouteLocationRaw } from 'vue-router'
export type DsfrSideMenuListItemProps = { active?: boolean }
export type DsfrSideMenuLinkProps = {
active?: boolean
to: string
}
export type DsfrSideMenuProps = {
buttonLabel?: string
id?: string
sideMenuListId?: string
collapseValue?: string
menuItems?: DsfrSideMenuListItemProps[]
headingTitle?: string
titleTag?: string
focusOnExpanding?: boolean
}
export type DsfrSideMenuButtonProps = {
active?: boolean
expanded?: boolean
controlId: string
}
export type DsfrSideMenuListProps = {
id: string
collapsable?: boolean
expanded?: boolean
menuItems?: (
DsfrSideMenuListItemProps & Partial<DsfrSideMenuListProps & { to?: RouteLocationRaw, text?: string }>
& { menuItems?: (DsfrSideMenuListItemProps & Partial<DsfrSideMenuListProps & { to?: RouteLocationRaw, text?: string }>)[] }
)[]
focusOnExpanding?: boolean
}