| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
 100
 101
 102
 103
 104
 105
 106
 107
 108
 109
 110
 111
 112
 113
 114
 115
 116
 117
 118
 119
 120
 121
 122
 123
 124
 125
 126
 127
 128
 129
 130
 131
 132
 133
 134
 135
 136
 137
 138
 139
 140
 141
 142
 143
 144
 145
 146
 147
 148
 149
 150
 151
 152
 153
 154
 155
 156
 157
 158
 159
 160
 161
 162
 163
 164
 165
 166
 167
 168
 169
 170
 171
 172
 173
 174
 175
 176
 177
 178
 179
 180
 181
 182
 183
 184
 185
 186
 187
 188
 189
 190
 191
 192
 193
 194
 195
 196
 197
 198
 199
 200
 201
 202
 203
 204
 205
 206
 207
 208
 209
 210
 211
 212
 213
 214
 215
 216
 217
 218
 219
 220
 221
 222
 223
 224
 225
 226
 227
 228
 229
 230
 231
 232
 233
 234
 235
 236
 237
 238
 239
 240
 241
 242
 243
 244
 245
 246
 247
 248
 249
 250
 251
 252
 253
 254
 255
 256
 257
 258
 259
 260
 261
 262
 263
 264
 265
 266
 267
 268
 269
 270
 271
 272
 273
 274
 275
 276
 277
 278
 279
 280
 281
 282
 283
 284
 285
 286
 287
 288
 289
 290
 291
 292
 293
 294
 295
 296
 297
 298
 299
 300
 301
 302
 303
 304
 305
 306
 307
 308
 309
 310
 311
 312
 313
 314
 315
 316
 317
 318
 319
 320
 321
 322
 323
 324
 325
 326
 327
 328
 329
 330
 331
 332
 333
 334
 335
 336
 337
 338
 339
 340
 341
 342
 343
 344
 345
 346
 347
 348
 349
 350
 351
 352
 353
 354
 355
 356
 357
 358
 359
 360
 361
 362
 363
 364
 365
 366
 367
 368
 369
 370
 371
 372
 373
 374
 375
 376
 377
 378
 379
 380
 381
 382
 383
 384
 385
 386
 387
 388
 389
 390
 391
 392
 393
 394
 395
 396
 397
 398
 399
 400
 401
 402
 403
 404
 405
 406
 407
 408
 409
 410
 411
 412
 413
 414
 415
 416
 417
 418
 419
 420
 421
 422
 423
 424
 425
 426
 427
 428
 429
 430
 431
 432
 433
 434
 435
 436
 437
 438
 439
 440
 441
 442
 443
 444
 445
 446
 447
 448
 449
 450
 451
 452
 453
 454
 455
 456
 457
 458
 459
 460
 461
 462
 463
 464
 465
 466
 467
 468
 469
 470
 471
 472
 473
 474
 475
 476
 477
 478
 
 | ---
sidebar: auto
---
# API
## `<router-link>`
`<router-link>` est le composant pour activer la navigation utilisateur dans une application où le routeur est activé. La localisation cible est spécifiée grâce à la prop `to`. Il est rendu en tant que balise `<a>` avec le `href` correct par défaut, mais peut être configuré grâce à la prop `tag`. De plus, le lien se verra attribuer une classe CSS active lorsque la route cible est active.
`<router-link>` est préféré par rapport au `<a href="...">` en dur dans le code pour les raisons suivantes :
- Cela fonctionne de la même manière qu'on soit dans le mode historique HTML5 ou le mode hash, donc si vous avez décidé de changer de mode, ou alors que le routeur se replie sur le mode hash pour IE9, rien n'a besoin d'être changé.
- Dans le mode historique HTML5, `router-link` interceptera l'évènement du clic, comme ça le navigateur n'essaiera pas de rafraichir la page.
- En utilisant l'option `base` dans le mode historique HTML5, vous n'avez pas besoin de l'inclure dans la prop `to`
### `v-slot` API (3.1.0+)
`router-link` est fortement personnalisable via une [slot avec portée](https://fr.vuejs.org/v2/guide/components-slots.html#Slots-avec-portee). C'est une API qui cible principalement les créateurs de bibliothèque, mais elle peut aussi servir pour les développeurs, le plus souvent dans des composants personnalisés tel qu'un _NavLink_ et autre.
**Lors de l'utilisation `v-slot` API, il faut obligatoirement passer un composant enfant unique au `router-link`**. Si vous ne le faites pas, `router-link` va entourer ses enfants avec une balise `span`.
```html
<router-link
  to="/about"
  custom
  v-slot="{ href, route, navigate, isActive, isExactActive }"
>
  <NavLink :active="isActive" :href="href" @click="navigate"
    >{{ route.fullPath }}</NavLink
  >
</router-link>
```
- `href`: URL résolue. Ce serait l'attribut `href` d'une balise `a`
- `route`: localisation normalisée et résolue
- `navigate`: fonction pour lancer la navigation. **En cas de nécessité il va automatiquement empêcher les événements**, de la même façon que `router-link`
- `isActive`: `true` si [active class](#active-class) devrait être appliqué. Permet d'appliquer une classe arbitraire
- `isExactActive`: `true` si [exact active class](#exact-active-class) devrait être appliqué. Permet d'appliquer une classe arbitraire
### Appliquer la classe active à l'élément extérieur
Parfois, on voudrait que la classe active soit appliquée à un élément extérieur au lieu de l'élément `<a>` lui-même, dans ce cas, vous pouvez faire le rendu de cet élément extérieur en utilisant `<router-link>` et en entourant le tag `<a>` :
```html
<router-link tag="li" to="/foo">
  <a>/foo</a>
</router-link>
```
Dans ce cas, `<a>` sera le lien actuel (et récupèrera le bon `href`), mais la classe active sera appliquée à l'élément extérieur `<li>`.
## `<router-link>` Props
### to
- type : `string | Location`
- requis
  Désigne la route cible du lien. Lorsqu'il est cliqué, la valeur de la prop `to` va être passée de manière interne à `router.push`, donc la valeur peut soit être une chaine de caractères, ou alors un objet décrivant une localisation.
  ```html
  <!--  chaine littérale  -->
  <router-link to="home">Accueil</router-link>
  <!-- rend -->
  <a href="home">Accueil</a>
  <!-- expression JavaScript en utilisant `v-bind` -->
  <router-link v-bind:to="'home'">Accueil</router-link>
  <!-- Omettre `v-bind` est OK, tout comme une autre prop -->
  <router-link :to="'home'">Accueil</router-link>
  <!-- pareil qu'au-dessus -->
  <router-link :to="{ path: 'home' }">Accueil</router-link>
  <!-- route nommée -->
  <router-link :to="{ name: 'user', params: { userId: 123 }}"
    >Utilisateur</router-link
  >
  <!-- avec une requête, résulte en `/register?plan=private` -->
  <router-link :to="{ path: 'register', query: { plan: 'private' }}"
    >S'enregistrer</router-link
  >
  ```
### replace
- type : `boolean`
- défaut : `false`
  Configurer la prop `replace` appellera `router.replace()` au lieu de `router.push()` lors du clic, comme ça, la navigation ne laissera pas un enregistrement dans l'historique.
  ```html
  <router-link :to="{ path: '/abc'}" replace></router-link>
  ```
### append
- type : `boolean`
- défaut : `false`
  Configurer la propriété `append` suffixe toujours le chemin relatif au chemin courant. Par exemple, assumons que nous naviguons de `/a` à un lien relatif `b`, sans `append` on finira sur `/b`, mais avec `append` on finira sur `/a/b`.
  ```html
  <router-link :to="{ path: 'relative/path'}" append></router-link>
  ```
### tag
- type : `string`
- défaut : `"a"`
  Parfois, on veut que `<router-link>` soit rendu avec une balise différente, ex : `<li>`. On peut alors utiliser la prop `tag` pour modifier la balise qui sera rendue, et elle écoutera toujours les évènements de clic pour la navigation.
  ```html
  <router-link to="/foo" tag="li">foo</router-link>
  <!-- rend -->
  <li>foo</li>
  ```
### active-class
- type : `string`
- défaut : `"router-link-active"`
  Configure la classe CSS active qui sera appliquée lorsque le lien sera actif. Notez que la valeur par défaut peut aussi être configurée de manière globale via l'option `linkActiveClass` du constructeur du routeur.
### exact
- type : `boolean`
- défaut : `false`
Le comportement par défaut de la correspondance de classe active est une **correspondance inclusive**. Par exemple, `<router-link to="/a">` verra cette classe appliquée tant que le chemin courant commencera par `/a/` ou `/a`.
Une conséquence de cela est que `<router-link to="/">` sera actif pour toutes les routes ! Pour forcer le lien dans un « mode correspondance exacte », utilisez la prop `exact`.
```html
<!-- ce lien sera uniquement actif à `/` -->
<router-link to="/" exact></router-link>
```
Allez voir les exemples expliquant la classe active pour les liens [ici](https://jsfiddle.net/8xrk1n9f/).
### event
- type : `string | Array<string>`
- défaut : `'click'`
  Spécifie les évènement(s) que peu(ven)t lancer la navigation de lien.
### exact-active-class
- type : `string`
- défaut : `"router-link-exact-active"`
  Configure la classe CSS active qui sera appliquée lorsqu'un lien sera actif avec une correspondance exacte. Notez que la valeur par défaut peut aussi être configurée de manière globale via l'option `linkExactActiveClass` du constructeur du routeur.
## `<router-view>`
Le composant `<router-view>` est un composant fonctionnel qui fait le rendu du composant correspondant au chemin donné. Les composants rendus dans `<router-view>` peuvent aussi contenir leur propre `<router-view>`, qui fera le rendu des composants pour les chemins imbriqués.
## `<router-view>` Props
### name
- type : `string`
- défaut : `"default"`
  Lorsqu'un `<router-view>` a un nom, il fera le rendu du composant correspondant à ce nom dans les itinéraires de route correspondant à l'option `components`. Voir les [Routes nommées](../guide/essentials/named-views.md) pour un exemple.
## Options de construction du routeur
### routes
- type: `Array<RouteConfig>`
  Déclaration de type pour `RouteConfig` :
  ```js
  declare type RouteConfig = {
    path: string,
    component?: Component,
    name?: string, // pour les routes nommées
    components?: { [name: string]: Component }, // pour les vues nommées
    redirect?: string | Location | Function,
    props?: boolean | string | Function,
    alias?: string | Array<string>,
    children?: Array<RouteConfig>, // pour les routes imbriquées
    beforeEnter?: (to: Route, from: Route, next: Function) => void,
    meta?: any,
    // 2.6.0+
    caseSensitive?: boolean, // use case sensitive match? (default: false)
    pathToRegexpOptions?: Object // path-to-regexp options for compiling regex
  }
  ```
### mode
- type : `string`
- défaut : `"hash" (dans le navigateur) | "abstract" (en Node.js)`
- valeurs disponibles : `"hash" | "history" | "abstract"`
  Configure le mode du routeur.
  - `hash` : utilise le hash de l'URL pour le routage. Fonctionne dans tous les navigateurs supportés par Vue, ainsi que ceux qui ne supportent pas l'API History d'HTML5.
  - `history` : nécessite l'API History d'HTML 5 et la configuration du serveur. Voir [Mode historique de HTML5](../guide/essentials/history-mode.md).
  - `abstract` : fonctionne dans tous les environnements JavaScript, ex. côté serveur avec Node.js. **Le routeur sera automatiquement forcé d'utiliser ce mode si aucune API navigateur n'est présente.**
### base
- type : `string`
- défaut : `"/"`
  L'URL de base de l'application. Par exemple, si l'application monopage entière est distribuée sous `/app/`, alors `base` doit utiliser la valeur `"/app/"`.
### linkActiveClass
- type : `string`
- défaut : `"router-link-active"`
  Configure de manière globale la classe active par défaut de `<router-link>`. Voir aussi [router-link](./#router-link).
### linkExactActiveClass
- type : `string`
- default : `"router-link-exact-active"`
  Configure de manière globale la classe active par défaut de `<router-link>` lors d'une correspondance exacte. Voir aussi [router-link](./#router-link).
### scrollBehavior
- type : `Function`
  Signature :
  ```ts
  type PositionDescriptor =
    { x: number, y: number } |
    { selector: string } |
    void
  type scrollBehaviorHandler = (
    to: Route,
    from: Route,
    savedPosition?: { x: number, y: number }
  ) => PositionDescriptor | Promise<PositionDescriptor>
  ```
  Pour plus de détails, voir [Comportement du Scroll](../guide/advanced/scroll-behavior.md).
### parseQuery / stringifyQuery
- type : `Function`
  Permettent de spécifier des fonctions personnalisées pour formater en objet ou en chaîne de caractères la requête. Surcharge les fonctions par défaut.
### fallback
- type : `boolean`
  Contrôle comment le routeur devrait passer en mode `hash` quand le navigateur ne supporte pas `history.pushState`. Par défaut à `true`.
  Passer cette valeur à `false` va essentiellement faire que la navigation via `router-link` va réclamer un rechargement de page dans IE9. Ceci est utile quand l'application est rendue côté serveur et à besoin de fonctionner dans IE9, car le mode hash ne fonctionne pas avec du SSR.
## L'instance du routeur
### router.app
- type: `instance de Vue`
L'instance racine de Vue dans laquelle l'instance de `routeur` a été injectée.
### router.mode
- type: `string`
  Le [mode](./#mode) que le routeur utilise.
### router.currentRoute
- type: `Route`
  La route actuelle représentée en tant qu'un [objet route](./#proprietes-de-l-objet-route).
## Méthodes
### router.beforeEach
### router.beforeResolve
### router.afterEach
Ajout des interceptions globales de navigation. Voir les [Intercepteurs de navigation](../guide/advanced/navigation-guards.md).
Dans la version 2.5.0+, ces trois méthodes retournent une fonction qui enlève les fonctions d'interception et hooks enregistrés.
### router.push
### router.replace
### router.go
### router.back
### router.forward
Navigue à une nouvelle URL de façon programmée. Voir [Navigation de façon programmée](../guide/essentials/navigation.md).
### router.getMatchedComponents
Retourne un tableau de composants (définition/constructeur et non les instances) correspondant à la `location` passée en paramètre, ou alors de la route actuelle. Cette fonction est principalement utilisée pendant le rendu côté serveur afin d'effectuer une prérécupération des données.
### router.resolve
Inverse la résolution d'URL. La `location` doit avoir la même forme qu'utilisée dans `<router-link>`, retourne un objet avec les propriétés suivantes :
```js
{
  location: Location
  route: Route
  href: string
}
```
- `current` is the current Route by default (most of the time you don't need to change this)
- `append` allows you to append the path to the `current` route (as with [`router-link`](./#router-link-props))
### router.addRoutes
Permet d'ajouter dynamiquement des routes au routeur. L'argument doit être un tableau utilisant le même format de configuration que l'option `routes` du constructeur.
### router.onReady
Cette méthode met en file d'attente une fonction de rappel qui sera appelée lorsque le routeur aura complété la navigation initiale, ce qui signifie qu'il a résolu tous les hooks d'entrées asynchrones et composants asynchrones qui sont associés à la route initiale.
C'est utile pendant un rendu côté serveur pour assurer une sortie consistance sur le serveur et le client.
Le deuxième argument `errorCallback` est uniquement supporté à partir de la version 2.4. Il sera appelé lorsque la résolution de la route initiale résultera en une erreur (ex. : la résolution d'un composant asynchrone qui a échoué).
### router.onError
Enregistre une fonction de rappel qui sera appelée lorsqu'une erreur sera capturée pendant la navigation vers une route. Notez que pour qu'une erreur soit appelée, cela doit correspondre à l'un des scénarios suivants :
- L'erreur est lancée de manière synchrone à l'intérieur d'une fonction d'interception de route ;
- L'erreur est capturée et traitée de manière asynchrone en appelant `next(err)` à l'intérieur d'une fonction d'interception de route ;
- Une erreur est survenue pendant la résolution d'un composant asynchrone qui est requis pour faire le rendu d'une route.
# L'objet `Route`
Un **objet `Route`** représente l'état actuel de la route active. Il contient des informations analysées à propos de l'URL courant et **les itinéraires de route** appariés par l'URL.
L'objet `Route` est immutable. Chaque navigation qui se déroule avec succès résultera en un nouvel objet `Route`.
L'objet `Route` peut être trouvé à plusieurs endroits :
- À l'intérieur des composants en tant que `this.$route`
- À l'intérieur des fonctions de rappel des observateurs de `$route`
- Comme valeur de retour après l'appel de `router.match(location)`
- À l'intérieur des fonctions d'interception de la navigation, dans les deux premiers paramètres de la fonction :
  ```js
  router.beforeEach((to, from, next) => {
    // `to` et `from` sont tous les deux des objets Route
  })
  ```
- À l'intérieur de la fonction `scrollBehavior` dans les deux premiers arguments :
  ```js
  const router = new VueRouter({
    scrollBehavior(to, from, savedPosition) {
      // `to` et `from` sont tous les deux des objets Route
    }
  })
  ```
### Propriétés de l'objet `Route`
- **\$route.path**
  - type : `string`
    Une chaine de caractères représentant le chemin de la route en cours, toujours résolue en tant que chemin absolu, ex : `"/foo/bar"`.
- **\$route.params**
  - type : `Object`
    Un objet qui contient des pairs clé/valeur de segments dynamiques et segments _star_. S'il n'y a pas de paramètres, alors la valeur sera un objet vide.
- **\$route.query**
  - type : `Object`
    Un objet qui contient des pairs clé/valeur de la requête au format d'une chaine de caractères. Par exemple, pour un chemin `/foo?user=1`, on aura `$route.query.user == 1`. S'il n'y a pas de requête, alors la valeur sera un objet vide.
- **\$route.hash**
  - type : `string`
    Le hash de la route courante (avec le `#`), s'il y en a un. S'il n'y a pas de hash, alors la valeur sera une chaine de caractères vide.
- **\$route.fullPath**
  - type : `string`
    L'URL entièrement résolu, incluant la requête et le hash.
- **\$route.matched**
  - type : `Array<RouteRecord>`
    Un `Array` contenant les **les itinéraires de la route** pour chaque segment de chemin imbriqué de la route courante. Les itinéraires de la route sont des copies des objets dans le tableau de configuration `routes` (et dans les tableaux `children`).
  ```js
  const router = new VueRouter({
    routes: [
      // l'objet qui suit est un itinéraire de route
      {
        path: '/foo',
        component: Foo,
        children: [
          // c'est aussi un itinéraire
          { path: 'bar', component: Bar }
        ]
      }
    ]
  })
  ```
  Lorsque l'URL sera `/foo/bar`, `$route.matched` sera un `Array` contenant les deux objets (clonés), dans l'ordre parent à l'enfant.
- **\$route.name**
  Le nom de la route courante, si elle en a un. (Voir [Routes nommées](../guide/essentials/named-routes.md)).
- **\$route.redirectedFrom**
  Le nom de la route d'où la page a été redirigée, si elle en a un. (Voir [Redirection et alias](../guide/essentials/redirect-and-alias.md)).
## Injections de composant
### Propriétés injectées
Ces propriétés sont injectées dans chacun des composants enfants, en passant l'instance du routeur à l'application racine de Vue en tant qu'option `router`.
- **\$router**
  L'instance du routeur.
- **\$route**
La [Route](./#proprietes-de-l-objet-route) actuellement active. C'est une propriété en lecture seule et ses propriétés sont immutables, mais elles restent malgré tout observables.
### Options activées
- **beforeRouteEnter**
- **beforeRouteUpdate** (ajouté en 2.2)
- **beforeRouteLeave**
  Voir l'[interception par composant](../guide/advanced/navigation-guards.md#securisation-par-composant).
 |