Nuxt/examples/async-data
Sébastien Chopin ae9b41f321 Add callback argument (optional) in data 2016-11-19 22:16:26 +01:00
..
pages Add callback argument (optional) in data 2016-11-19 22:16:26 +01:00
README.md Add callback argument (optional) in data 2016-11-19 22:16:26 +01:00
nuxt.config.js Move vendor and filenames in build key and add loaders 2016-11-09 02:35:13 +01:00
package.json Add package.jsonn in examples 2016-11-10 14:30:18 +01:00

README.md

Async data with Nuxt.js

data (context)

Nuxt.js supercharges the data method from vue.js to let you handle async operation before setting the component data.

data is called every time before loading the component (only if attached to a route). It can be called from the server-side or before navigating to the corresponding route.

The data method receives the context as the first argument, you can use it to fetch some data and return the component data. To make the data method asynchronous, Nuxt.js offers you 2 ways, choose the one you're the most familiar with:

  1. returning a Promise, Nuxt.js will wait for the promise to be resolved before rendering the Component
  2. Define a second argument which is a callback method to be called like this: callback(err, data)

Example with returning a Promise:

export default {
  data ({ params }) {
    return axios.get(`https://my-api/posts/${params.id}`)
    .then((res) => {
      return { title: res.data.title }
    })
  }
}

Example with using the callback argument:

export default {
  data ({ params }, callback) {
    axios.get(`https://my-api/posts/${params.id}`)
    .then((res) => {
      callback(null, { title: res.data.title })
    })
  }
}

And then, you can display the data inside your template:

<template>
  <h1>{{ title }}</h1>
</template>

Context

List of all the available keys in context:

Key Type Available Description
isClient Boolean Client & Server Boolean to let you know if you're actually renderer from the client-side
isServer Boolean Client & Server Boolean to let you know if you're actually renderer from the server-side
isDev Boolean Client & Server Boolean to let you know if you're in dev mode, can be useful for caching some data in production
route vue-router route Client & Server vue-router route instance see documentation
store vuex store Client & Server Vuex.Store instance. Available only if store: true is set in nuxt.config.js
params Object Client & Server Alias of route.params
query Object Client & Server Alias of route.query
req http.Request Server Request from the node.js server. If nuxt is used as a middleware, the req object might be different depending of the framework you're using.
res http.Response Server Response from the node.js server. If nuxt is used as a middleware, the res object might be different depending of the framework you're using.
redirect Function Client & Server Use this method to redirect the user to another route, the status code is used on the server-side, default to 302. redirect([status,] path [, query])
error Function Client & Server Use this method to show the error page: error(params). The params should have the fields statusCode and message.

Handling errors

Nuxt.js add the error(params) method in the context, you can call it to display the error page. params.statusCode will be also used to render the proper status code form the server-side.

Example with a Promise:

export default {
  data ({ params, error }) {
    return axios.get(`https://my-api/posts/${params.id}`)
    .then((res) => {
      return { title: res.data.title }
    })
    .catch((e) => {
      error({ statusCode: 404, message: 'Post not found' })
    })
  }
}

If you're using the callback argument, you can call it directly with the error, Nuxt.js will call the error method for you:

export default {
  data ({ params }, callback) {
    axios.get(`https://my-api/posts/${params.id}`)
    .then((res) => {
      callback(null, { title: res.data.title })
    })
    .catch((e) => {
      callback({ statusCode: 404, message: 'Post not found' })
    })
  }
}

Demo

npm install
npm start

Go to http://localhost:3000 and navigate trough the app.