|
| 1 | +--- |
| 2 | +title: Données asynchrones |
| 3 | +description: Vous voudrez peut-être récupérer des données et faire le rendu côté serveur. Nuxt.js ajoute une méthode `asyncData` pour vous permettre de gérer les opérations asynchrones avant de définir les données du composant. |
| 4 | +--- |
| 5 | + |
| 6 | +> Vous voudrez peut-être récupérer des données et faire le rendu côté serveur. Nuxt.js ajoute une méthode `asyncData` pour vous permettre de gérer les opérations asynchrones avant de définir les données du composant. |
| 7 | +
|
| 8 | +## La méthode asyncData |
| 9 | + |
| 10 | +Parfois, vous souhaitez simplement récupérer des données et les faire le rendu côté serveur sans utiliser de *store*. `asyncData` est appelé avant chaque chargement du composant (**uniquement pour les composants pages**). |
| 11 | +On peut l'appeler côté serveur ou avant de naviguer vers la route correspondante. |
| 12 | +Cette méthode reçoit [le contexte](/api#context) comme premier argument, vous pouvez l'utiliser pour récupérer des données et nuxt.js fusionnera avec les données du composant. |
| 13 | + |
| 14 | +<div class="Alert Alert--orange">Vous **n'avez pas** accès à l'instance du composant via `this` au sein de `data` parce que la fonction est appelée **avant d'initier** le composant.</div> |
| 15 | + |
| 16 | +Nuxt.js vous propose différentes façons d'utiliser `asyncData`. Choisissez celle avec laquelle vous êtes le plus familier: |
| 17 | + |
| 18 | +1. Retourner une `Promise`. Nuxt.js attends que la Promise soit résolue avant de faire le rendu du composant. |
| 19 | +2. En utilisant [async/await](https://github.com/lukehoban/ecmascript-asyncawait) ([en savoir plus](https://zeit.co/blog/async-and-await)) |
| 20 | +3. En définissant un callback comme second argument. Il doit être appelé comme suit: `callback(err, data)` |
| 21 | + |
| 22 | +### Retourner une Promise |
| 23 | +```js |
| 24 | +export default { |
| 25 | + asyncData ({ params }) { |
| 26 | + return axios.get(`https://my-api/posts/${params.id}`) |
| 27 | + .then((res) => { |
| 28 | + return { title: res.data.title } |
| 29 | + }) |
| 30 | + } |
| 31 | +} |
| 32 | +``` |
| 33 | + |
| 34 | +### Utiliser async/await |
| 35 | +```js |
| 36 | +export default { |
| 37 | + async asyncData ({ params }) { |
| 38 | + let { data } = await axios.get(`https://my-api/posts/${params.id}`) |
| 39 | + return { title: data.title } |
| 40 | + } |
| 41 | +} |
| 42 | +``` |
| 43 | + |
| 44 | +### Utiliser un callback |
| 45 | +```js |
| 46 | +export default { |
| 47 | + asyncData ({ params }, callback) { |
| 48 | + axios.get(`https://my-api/posts/${params.id}`) |
| 49 | + .then((res) => { |
| 50 | + callback(null, { title: res.data.title }) |
| 51 | + }) |
| 52 | + } |
| 53 | +} |
| 54 | +``` |
| 55 | + |
| 56 | +### Afficher les données |
| 57 | + |
| 58 | +Le résultat d'`asyncData` sera **mergé** avec les données. |
| 59 | +Vous pouvez afficher les données au sein du template comme habituellement. |
| 60 | + |
| 61 | +```html |
| 62 | +<template> |
| 63 | + <h1>{{ title }}</h1> |
| 64 | +</template> |
| 65 | +``` |
| 66 | + |
| 67 | +## Le Context |
| 68 | + |
| 69 | +Pour voir la liste des attributs disponibles dans le `context`, jeter un oeil à [API Pages data](/api). |
| 70 | + |
| 71 | +## Gestion des erreurs |
| 72 | + |
| 73 | +Nuxt.js ajoute la méthode `error(params)` au `context`, vous pouvez l'appeler pour afficher la page d'erreur. `Params.statusCode` sera également utilisé pour faire le rendu avec le code de status approprié côté serveur. |
| 74 | + |
| 75 | +Exemple avec une `Promise`: |
| 76 | +```js |
| 77 | +export default { |
| 78 | + asyncData ({ params, error }) { |
| 79 | + return axios.get(`https://my-api/posts/${params.id}`) |
| 80 | + .then((res) => { |
| 81 | + return { title: res.data.title } |
| 82 | + }) |
| 83 | + .catch((e) => { |
| 84 | + error({ statusCode: 404, message: 'Post not found' }) |
| 85 | + }) |
| 86 | + } |
| 87 | +} |
| 88 | +``` |
| 89 | + |
| 90 | +Si vous utilisez l'argument `callback`, vous pouvez l'appeler directement en lui passant l'erreur et nuxt.js appellera la méthode `error` pour vous: |
| 91 | +```js |
| 92 | +export default { |
| 93 | + asyncData ({ params }, callback) { |
| 94 | + axios.get(`https://my-api/posts/${params.id}`) |
| 95 | + .then((res) => { |
| 96 | + callback(null, { title: res.data.title }) |
| 97 | + }) |
| 98 | + .catch((e) => { |
| 99 | + callback({ statusCode: 404, message: 'Post not found' }) |
| 100 | + }) |
| 101 | + } |
| 102 | +} |
| 103 | +``` |
| 104 | + |
| 105 | +Pour modifier la page d'erreur, voir [Views layouts section](/guide/views#layouts). |
0 commit comments