Concordance dynamique de route

Vous allez très souvent associer des routes avec un motif donné à un même composant. Par exemple nous pourrions avoir le composant User qui devrait être rendu pour tous les utilisateurs mais avec différents identifiants. Avec vue-router nous pouvons utiliser des segments dynamiques dans le chemin de la route pour réaliser cela :

const User = {
  template: '<div>Utilisateur</div>'
}

const router = new VueRouter({
  routes: [
    // Les segments dynamiques commencent avec la ponctuation deux-points
    { path: '/utilisateur/:id', component: User }
  ]
})

Maintenant des URL comme /utilisateur/foo et /utilisateur/bar seront chacun associé à la même route.

Un segment dynamique se repère avec les deux-points :. Quand une route concorde, la valeur du segment dynamique est exposée via this.$route.params dans tous les composants. Et donc, nous pouvons faire le rendu de l'identifiant de l'utilisateur courant en mettant à jour le template de User ainsi :

const User = {
  template: '<div>Utilisateur {{ $route.params.id }}</div>'
}

Vous pouvez regarder un exemple en ligne ici.

Vous pouvez avoir plusieurs segments dynamiques pour une même route, et ils seront associés aux champs associés dans $route.params. Des exemples :

motif chemin concordant $route.params
/utilisateur/:username /utilisateur/evan { username: 'evan' }
/utilisateur/:username/billet/:post_id /utilisateur/evan/billet/123 { username: 'evan', post_id: 123 }

En plus de $route.params, l'objet $route expose également d'autres informations utiles comme la $route.query (s'il y a une requête dans l'URL), $route.hash, etc. Vous pouvez accéder à tous les détails de cela dans la référence de l'API.

Réactivité aux changements de paramètres

Une chose à noter quand vous utilisez des routes avec des paramètres (segments), c'est que lors de la navigation de l'utilisateur de /utilisateur/foo vers /utilisateur/bar, la même instance de composant va être réutilisée. Puisque les deux routes font le rendu du même composant, cela est plus performant que de détruire l'ancienne instance et d'en créer une nouvelle. Cependant, cela signifie également que les hooks de cycle de vie ne seront pas appelés.

Pour réagir aux changements de paramètres dans le même composant, vous pouvez simplement observer l'objet $route :

const User = {
  template: '...',
  watch: {
    '$route' (to, from) {
      // réagir au changement de route...
    }
  }
}

Ou utiliser la fonction d'interception beforeRouteUpdate introduite avec la 2.2 :

const User = {
  template: '...',
  beforeRouteUpdate (to, from, next) {
    // réagir au changement de route...
    // n'oubliez pas d'appeler `next()`
  }
}

Motifs de concordance avancés

vue-router utilise path-to-regexp comme moteur de concordance de chemin, il supporte donc plusieurs motifs de concordance avancés tels que la présence optionnelle de segments dynamiques, aucun ou plusieurs motifs, plus d'options par motifs, et même des motifs d'expressions régulières personnalisés. Consultez cette documentation pour utiliser ces motifs avancés et cet exemple pour les utiliser avec vue-router.

Priorité de concordance

Parfois la même URL peut être adressé par de multiples routes. Dans ce cas, la priorité de concordance est déterminée par l'ordre de la définition des routes : plus la route est définie tôt, plus sa priorité est élevée.