Nuxt.js学习(八) --- 异步数据

论坛 期权论坛 编程之家     
选择匿名的用户   2021-5-30 09:13   31   0

[TOC]

1、异步数据

1.1、官方文档:

Nuxt.js 扩展了 Vue.js,增加了一个叫 asyncData 的方法,使得我们可以在设置组件的数据之前能异步获取或处理数据。

asyncData 方法

asyncData方法会在组件(限于页面组件)每次加载之前被调用。它可以在服务端或路由更新之前被调用。 在这个方法被调用的时候,第一个参数被设定为当前页面的上下文对象,你可以利用 asyncData方法来获取数据,Nuxt.js 会将 asyncData 返回的数据融合组件 data 方法返回的数据一并返回给当前组件。

注意:由于asyncData方法是在组件初始化前被调用的,所以在方法内是没有办法通过 this 来引用组件的实例对象。

Nuxt.js 提供了几种不同的方法来使用 asyncData 方法,你可以选择自己熟悉的一种来用:

  1. 返回一个 Promise, nuxt.js会等待该Promise被解析之后才会设置组件的数据,从而渲染组件.
  2. 使用 async 或 await (了解更多)

我们使用[axios]重构HTTP请求,我们强烈建议您使用[axios模块]用于您的Nuxt项目中。

如果您的项目中直接使用了node_modules中的axios,并且使用axios.interceptors添加拦截器对请求或响应数据进行了处理,确保使用 axios.create创建实例后再使用。否则多次刷新页面请求服务器,服务端渲染会重复添加拦截器,导致数据处理错误。

import axios from 'axios'
const myaxios = axios.create({
  // ...
})
myaxios.interceptors.response.use(function (response) {
  return response.data
}, function (error) {
  // ...
})

返回 Promise

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

2、具体使用

2.1.1、安装Axios

构建项目时,如果选择了axios组件,这一步跳过

npm install axios --save

2.1.2、建议配置baseURL

2.2.1 使用asyncData--一次请求【掌握】

//asyncData语法1:使用context对象
<template>
 {{名称}}
</template>

<script>
export default {
    //asyncData不能使用this(当前组件)
    //提供第一个参数context,表示上下文(nuxt所有功能)
    asyncData( context ) {
        //发送ajax
        let 数据 = context.$axios.get('','')
        // 将数据组合并返回
        return {
            名称: 数据
        }
    }
}
</script>


//asyncData语法2:对context对象进行解构,context.$axios--->{$axios}
<script>
export default {
    async asyncData( {$axios} ) {
        //发送ajax
        let { data } = await $axios.get('路径')
        //封装
        return {
            变量: 查询数据
        }
    }
}
</script>

示例

<template>
  <div>
    {{pageInfo}}
  </div>
</template>

<script>
export default {
  async asyncData( context ) {
      //发送ajax
      let { data } = await context.$axios.get('/userservice/user/list')
      //组合数据
      return {
        pageInfo: data.data
      }
  },
}
</script>

<style>

</style>

普通ajax和asyncData对比

2.2.2 使用asyncData--多次请求【掌握】

  • 多次请求,需要借助 Promise ( $axios.get() 返回的就是 Promise对象 )
<script>
//很少直接使用“响应对象”
export default {
    async asyncData( {$axios} ) {
        //发送多次请求
        let [响应1,响应2] = await Promise.all([请求1, 请求2])
        //返回数据
        return {
            变量1: 响应1,
            变量2: 响应2
        }
    }
}
</script>
<script>
//对“响应对象”进行解构   响应1 --> { data }
//“响应1”和“响应2”,都可以解构出data,变量名重复&#}
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP