title: 轻松掌握useAsyncData获取异步数据
date: 2024/7/12
updated: 2024/7/12
author: cmdragon
excerpt:
摘要:本文详细介绍Nuxt.js中的useAsyncData组合式函数,它用于在服务端渲染(SSR)过程中异步获取数据,确保客户端正确水合,避免重复请求。内容包括基本概念、参数说明(key, handler, options)、示例用法、如何监听参数变化自动刷新数据及返回值详解,展示了在页面组件中使用useAsyncData的具体方式和注意事项。
categories:
tags:
扫描二维码关注或者微信搜一搜:编程智域 前端至全栈交流与成长
在Nuxt.js中,useAsyncData
是一个非常有用的组合式函数,它允许我们在服务端渲染(SSR)的过程中异步获取数据,同时确保这些数据能够在客户端正确地水合(hydrate),避免了不必要的重复请求。
useAsyncData
是一个组合式函数,它可以在 Nuxt
应用中的页面、组件或插件中使用。这个函数接受一个唯一的键和一个异步函数,异步函数的返回值将作为数据源。useAsyncData
返回一个响应式对象,其中包含了数据、加载状态、错误信息以及一个刷新数据的函数。
key:
string
useAsyncData
会自动生成一个基于文件名和行号的键。handler:
() => Promise<any>
或() => any
说明:一个异步函数,它返回一个Promise对象,该Promise对象在解析时提供数据。这个函数是必须的,并且其返回值不能是undefined
或null
,否则可能会导致请求重复。
options:
类型:Partial<AsyncDataOptions>
说明:这是一个可选的对象,可以包含以下属性:
server
:
boolean
true
,表示数据将在服务器端获取。lazy
:
boolean
false
,表示数据将在路由加载时立即获取。如果设置为true
,数据将在路由导航后异步获取,不会阻塞导航。immediate
:
boolean
true
,表示在路由加载时立即触发数据获取。如果设置为false
,数据获取将被延迟,直到首次访问该路由。default
:
(data: any) => any
data
的默认值。这在lazy: true
或immediate: false
时非常有用。transform
:
(data: any) => any
handler
函数的结果后修改数据。pick
:
(data: any) => any
handler
函数的结果中挑选特定的键。watch
:
(data: any) => any
deep
:
boolean
true
,表示返回深层响应式对象。如果设置为false
,则返回浅层响应式对象,这可能在某些情况下提高性能。以下是在pages/index.vue
页面中使用useAsyncData
的示例:
<template>
<div>
<div v-if="pending">加载中...</div>
<div v-else-if="error">错误:{{ error.message }}</div>
<div v-else>
<ul>
<li v-for="mountain in data" :key="mountain.id">{{ mountain.name }}</li>
</ul>
</div>
</div>
</template>
<script setup>
// 使用 useAsyncData 获取数据
const {data, pending, error, refresh} = await useAsyncData(
'mountains', // 唯一键,用于确保数据获取的正确性
() => $fetch('https://api.nuxtjs.dev/mountains') // 异步函数,返回数据
)
</script>
useAsyncData
调用,每个键都应该是唯一的。Promise
,该Promise
在解析时提供所需的数据。useAsyncData
的键在整个应用中是唯一的,以避免数据冲突。watch
选项来自动重新获取数据。useAsyncData
组合式函数确实允许你监听外部变量的变化,并在这些变量发生变化时重新运行异步数据获取器。下面是如何在pages/index.vue
中使用watch
选项来监听page
变量的变化,并相应地更新数据的一个示例。
<template>
<div>
<div v-if="pending">加载中...</div>
<div v-else-if="error">错误:{{ error.message }}</div>
<div v-else>
<ul>
<li v-for="post in posts" :key="post.id">{{ post.title }}</li>
</ul>
<!-- 假设有一个分页组件或按钮来改变页码 -->
<button @click="page.value++">下一页</button>
</div>
</div>
</template>
<script setup>
// 创建一个响应式引用来存储当前页码
const page = ref(1)
// 使用 useAsyncData 获取数据,并监听 page 变量的变化
const { data: posts, pending, error, refresh } = await useAsyncData(
'posts',
() => $fetch('https://fakeApi.com/posts', {
params: {
page: page.value // 将当前页码作为参数传递给 API
}
}),
{
watch: [page] // 监听 page 变量的变化
}
)
</script>
page
:我们使用ref
创建了一个响应式引用page
,用来存储当前页码。useAsyncData
获取数据:我们使用useAsyncData
来获取数据,并将page
作为参数传递给watch
选项的对象,其中指定了要监听的响应式引用page
。page
变化:当page
的值发生变化时,useAsyncData
会自动重新运行获取器函数,并使用新的页码值来获取数据。page
、posts
、pending
、error
和refresh
函数返回到模板中,以便在模板中访问和使用这些数据。data
data
属性包含异步函数返回的结果。在请求完成之前,它可能是undefined
。
const { data } = useAsyncData('key', async () => {
const response = await fetch('/api/data');
return await response.json();
});
// 在模板中使用 data
<div>{{ data ? data.someProperty : '加载中...' }}</div>
pending
refresh/execute
error
status
余下文章内容请点击跳转至 个人博客页面 或者 扫码关注或者微信搜一搜:编程智域 前端至全栈交流与成长
,阅读完整的文章:轻松掌握useAsyncData获取异步数据 | cmdragon's Blog
useAppConfig
:轻松管理应用配置 | cmdragon's Blog这篇文章介绍了Redis的单机配置启动和主从架构、哨兵、集群搭建方法。无论你是初学者还是有一定经验的开发者,这篇文章都能为你提供实用的指导,让你轻松掌握Redis的配置和架构搭建。