|
| 1 | +--- |
| 2 | +title: Routage |
| 3 | +description: Nuxt.js utilise le système de fichiers pour générer les routes de votre applications web. |
| 4 | +--- |
| 5 | + |
| 6 | +> Nuxt.js génère automatiquement la configuration pour [vue-router](https://github.com/vuejs/vue-router) en fonction de votre arborescence de fichiers Vue se trouvant au sein du répertoire `pages`. |
| 7 | +
|
| 8 | +## Routes basiques |
| 9 | + |
| 10 | +Cette arborescence: |
| 11 | + |
| 12 | +```bash |
| 13 | +pages/ |
| 14 | +--| user/ |
| 15 | +-----| index.vue |
| 16 | +-----| one.vue |
| 17 | +--| index.vue |
| 18 | +``` |
| 19 | + |
| 20 | +génère automatiquement: |
| 21 | + |
| 22 | +```js |
| 23 | +router: { |
| 24 | + routes: [ |
| 25 | + { |
| 26 | + name: 'index', |
| 27 | + path: '/', |
| 28 | + component: 'pages/index.vue' |
| 29 | + }, |
| 30 | + { |
| 31 | + name: 'user', |
| 32 | + path: '/user', |
| 33 | + component: 'pages/user/index.vue' |
| 34 | + }, |
| 35 | + { |
| 36 | + name: 'user-one', |
| 37 | + path: '/user/one', |
| 38 | + component: 'pages/user/one.vue' |
| 39 | + } |
| 40 | + ] |
| 41 | +} |
| 42 | +``` |
| 43 | + |
| 44 | +## Routes dynamiques |
| 45 | + |
| 46 | +Pour définir une route dynmaique à l'aide d'un paramètre, vous devez définir un fichier `.vue` OU un répertoire **préfixé par un souligner (`_`). |
| 47 | + |
| 48 | +Cette arborescence: |
| 49 | + |
| 50 | +```bash |
| 51 | +pages/ |
| 52 | +--| _slug/ |
| 53 | +-----| comments.vue |
| 54 | +-----| index.vue |
| 55 | +--| users/ |
| 56 | +-----| _id.vue |
| 57 | +--| index.vue |
| 58 | +``` |
| 59 | + |
| 60 | +génère automatiquement: |
| 61 | + |
| 62 | +```js |
| 63 | +router: { |
| 64 | + routes: [ |
| 65 | + { |
| 66 | + name: 'index', |
| 67 | + path: '/', |
| 68 | + component: 'pages/index.vue' |
| 69 | + }, |
| 70 | + { |
| 71 | + name: 'users-id', |
| 72 | + path: '/users/:id?', |
| 73 | + component: 'pages/users/_id.vue' |
| 74 | + }, |
| 75 | + { |
| 76 | + name: 'slug', |
| 77 | + path: '/:slug', |
| 78 | + component: 'pages/_slug/index.vue' |
| 79 | + }, |
| 80 | + { |
| 81 | + name: 'slug-comments', |
| 82 | + path: '/:slug/comments', |
| 83 | + component: 'pages/_slug/comments.vue' |
| 84 | + } |
| 85 | + ] |
| 86 | +} |
| 87 | +``` |
| 88 | + |
| 89 | +Comme vous pouvez le voir, la route nommée `users-id` contient le chemin `:id?` ce qui le rend optionnel; si vous voulez le rendre obligatoire, créez un fichier `index.vue` dans le dossier `users/_id`. |
| 90 | + |
| 91 | +### Validation des paramètres de routes |
| 92 | + |
| 93 | +Nuxt.js vous permet de définir une méthode de validation dans votre composant de routage dynamique. |
| 94 | + |
| 95 | +Par exemple: `pages/users/_id.vue` |
| 96 | + |
| 97 | +```js |
| 98 | +export default { |
| 99 | + validate ({ params }) { |
| 100 | + // Must be a number |
| 101 | + return /^\d+$/.test(params.id) |
| 102 | + } |
| 103 | +} |
| 104 | +``` |
| 105 | + |
| 106 | +Si la méthode de validation ne renvoie pas `true`, Nuxt.js chargera automatiquement la page d'erreur 404. |
| 107 | + |
| 108 | +Plus d'informations à propos de la méthode de validation: [API Pages validate](/api/pages-validate) |
| 109 | + |
| 110 | +## Routes imbriquées |
| 111 | + |
| 112 | +Nuxt.js vous permets de créer des routes imbriquées en utilisant les routes enfants de vue-router. |
| 113 | + |
| 114 | +Pour définir le composant parent d'un route imbriquée, vous devez créer un fichier Vue avec le **même nom que le répertoire** qui contient les vues enfants. |
| 115 | + |
| 116 | +<p class="Alert Alert--info">N'oubliez pas d'écrire `<nuxt-child/>` au sein du composant parent (fichier `.vue`).</p> |
| 117 | + |
| 118 | +Cette arborescence: |
| 119 | + |
| 120 | +```bash |
| 121 | +pages/ |
| 122 | +--| users/ |
| 123 | +-----| _id.vue |
| 124 | +-----| index.vue |
| 125 | +--| users.vue |
| 126 | +``` |
| 127 | + |
| 128 | +génère automatiquement: |
| 129 | + |
| 130 | +```js |
| 131 | +router: { |
| 132 | + routes: [ |
| 133 | + { |
| 134 | + path: '/users', |
| 135 | + component: 'pages/users.vue', |
| 136 | + children: [ |
| 137 | + { |
| 138 | + path: '', |
| 139 | + component: 'pages/users/index.vue', |
| 140 | + name: 'users' |
| 141 | + }, |
| 142 | + { |
| 143 | + path: ':id', |
| 144 | + component: 'pages/users/_id.vue', |
| 145 | + name: 'users-id' |
| 146 | + } |
| 147 | + ] |
| 148 | + } |
| 149 | + ] |
| 150 | +} |
| 151 | +``` |
| 152 | + |
| 153 | +## Routes dynamiques imbriquées |
| 154 | + |
| 155 | +Il est possible avec Nuxt.js d'avoir des routes dynamiques imbriquées dans des routes dynamiques; bien que ce scénario ne devrait pas être monnaie courante. |
| 156 | + |
| 157 | +Cette arborescence: |
| 158 | + |
| 159 | +```bash |
| 160 | +pages/ |
| 161 | +--| _category/ |
| 162 | +-----| _subCategory/ |
| 163 | +--------| _id.vue |
| 164 | +--------| index.vue |
| 165 | +-----| _subCategory.vue |
| 166 | +-----| index.vue |
| 167 | +--| _category.vue |
| 168 | +--| index.vue |
| 169 | +``` |
| 170 | + |
| 171 | +génère automatiquement: |
| 172 | + |
| 173 | +```js |
| 174 | +router: { |
| 175 | + routes: [ |
| 176 | + { |
| 177 | + path: '/', |
| 178 | + component: 'pages/index.vue', |
| 179 | + name: 'index' |
| 180 | + }, |
| 181 | + { |
| 182 | + path: '/:category', |
| 183 | + component: 'pages/_category.vue', |
| 184 | + children: [ |
| 185 | + { |
| 186 | + path: '', |
| 187 | + component: 'pages/_category/index.vue', |
| 188 | + name: 'category' |
| 189 | + }, |
| 190 | + { |
| 191 | + path: ':subCategory', |
| 192 | + component: 'pages/_category/_subCategory.vue', |
| 193 | + children: [ |
| 194 | + { |
| 195 | + path: '', |
| 196 | + component: 'pages/_category/_subCategory/index.vue', |
| 197 | + name: 'category-subCategory' |
| 198 | + }, |
| 199 | + { |
| 200 | + path: ':id', |
| 201 | + component: 'pages/_category/_subCategory/_id.vue', |
| 202 | + name: 'category-subCategory-id' |
| 203 | + } |
| 204 | + ] |
| 205 | + } |
| 206 | + ] |
| 207 | + } |
| 208 | + ] |
| 209 | +} |
| 210 | +``` |
| 211 | + |
| 212 | +## Transitions |
| 213 | + |
| 214 | +Nuxt.js utilise le composant [<transition>](http://vuejs.org/v2/guide/transitions.html#Transitioning-Single-Elements-Components) afin de vous permettre de créer des transitions/animations époustouflantes entre vos routes. |
| 215 | + |
| 216 | +### Paramètres globaux |
| 217 | + |
| 218 | +<p class="Alert Alert--info">Dans Nuxt.js, le nom de la transition par défaut est `"page"`.</p> |
| 219 | + |
| 220 | +Pour ajouter une transition de fondu à chaque page de votre application, nous avons besoin d'un fichier CSS qui est partagé sur toutes nos routes. Commençons par créer un fichier dans le dossier `assets`. |
| 221 | + |
| 222 | +Notre CSS global dans `assets/main.css`: |
| 223 | +```css |
| 224 | +.page-enter-active, .page-leave-active { |
| 225 | + transition: opacity .5s; |
| 226 | +} |
| 227 | +.page-enter, .page-leave-active { |
| 228 | + opacity: 0; |
| 229 | +} |
| 230 | +``` |
| 231 | + |
| 232 | +Nous ajoutons son chemin dans notre config `nuxt.config.js`: |
| 233 | +```js |
| 234 | +module.exports = { |
| 235 | + css: [ |
| 236 | + 'assets/main.css' |
| 237 | + ] |
| 238 | +} |
| 239 | +``` |
| 240 | + |
| 241 | +Plus d'informations à propos des transitions: [API Configuration transition](/api/pages-transition) |
| 242 | + |
| 243 | +### Paramètres des pages |
| 244 | + |
| 245 | +Vous êtes également libre de définir une transition personnalisée pour une seule page à l'aide de la propriété `transition`. |
| 246 | + |
| 247 | +Nous ajoutons une nouvelle classe dans notre CSS global `assets/main.css`: |
| 248 | +```css |
| 249 | +.test-enter-active, .test-leave-active { |
| 250 | + transition: opacity .5s; |
| 251 | +} |
| 252 | +.test-enter, .test-leave-active { |
| 253 | + opacity: 0; |
| 254 | +} |
| 255 | +``` |
| 256 | + |
| 257 | +puis, nous utilions la propriété transition pour définir le nom de la classe à utiliser pour cette transition de page: |
| 258 | +```js |
| 259 | +export default { |
| 260 | + transition: 'test' |
| 261 | +} |
| 262 | +``` |
| 263 | + |
| 264 | +Plus d'informations à propos de la propriété transition: [API Pages transition](/api/pages-transition) |
| 265 | + |
| 266 | +## Middleware |
| 267 | + |
| 268 | +> Le middleware vous permet de définir une fonction personnalisée qui sera exécutée avant le rendu d'une page ou d'un groupe de pages. |
| 269 | +
|
| 270 | +**Tous les middlewares devraient être placés dans le répertoire `middleware/`.** Le nom du fichier étant le nom du middleware (`middleware/auth.js` deviendra le middleware `auth`). |
| 271 | + |
| 272 | +Un middleware reçoit le [contexte](/api#context) comme premier argument: |
| 273 | + |
| 274 | +```js |
| 275 | +export default function (context) { |
| 276 | + context.userAgent = context.isServer ? context.req.headers['user-agent'] : navigator.userAgent |
| 277 | +} |
| 278 | +``` |
| 279 | + |
| 280 | +Le middleware sont exécuté en séries dans l'ordre suivant: |
| 281 | +1. `nuxt.config.js` |
| 282 | +2. Layouts correspondants |
| 283 | +3. Pages correspondantes |
| 284 | + |
| 285 | +Un middleware peut être asynchrone, retourner une `Promise` ou utiliser le `callback` (2ème arguement): |
| 286 | + |
| 287 | +`middleware/stats.js` |
| 288 | +```js |
| 289 | +import axios from 'axios' |
| 290 | + |
| 291 | +export default function ({ route }) { |
| 292 | + return axios.post('http://my-stats-api.com', { |
| 293 | + url: route.fullPath |
| 294 | + }) |
| 295 | +} |
| 296 | +``` |
| 297 | + |
| 298 | +Puis, dans `nuxt.config.js`, un layout ou une page, utilisez le mot clef `middleware`: |
| 299 | + |
| 300 | +`nuxt.config.js` |
| 301 | +```js |
| 302 | +module.exports = { |
| 303 | + router: { |
| 304 | + middleware: 'stats' |
| 305 | + } |
| 306 | +} |
| 307 | +``` |
| 308 | + |
| 309 | +Dans cet exemple, le middleware `stats` sera appelé à chaque changement de routes. |
| 310 | + |
| 311 | +Pour voir un exemple "réel" utilisant les middlewares, jeter un oeil à [example-auth0](https://github.com/nuxt/example-auth0) sur GitHub. |
0 commit comments