刚学Nuxt3项目,建了几个页面中间可以通过NuxtLink链接跳转,下面是一个页面,直接刷新useAsyncData相关的代码会执行,数据能拿到,但是通过其它页面跳转到这个页面时useAsyncData不执行,数据拿不到?这是为什么?useAsyncData代码需要放到生命周期里?
<template>
<div class="mt-[80px] flex items-center justify-center">
<div class="flex flex-col items-center">
<div>新闻页面</div>
<div>{{ route?.params.id }}</div>
<div>{{ list }}</div>
</div>
</div>
</template>
<script setup lang="ts">
import { useAsyncData } from '#app';
const route = useRoute();
const list = ref();
const url = 'https://www.xxxxxx.com/api/'; //我执行时是正确的地址
const res = await useAsyncData('info', () => $fetch(url), { lazy: true });
list.value = res.data.value?.data;
onMounted(() => {
console.log('xxxx');
});
</script>
<style scoped lang="less"></style>
在 Nuxt 3 中,
useAsyncData
是一个用于在组件外部(即在服务端或静态生成时)获取异步数据的 Composition API 函数。然而,你遇到的问题可能是由于对useAsyncData
的lazy
选项的误解。问题分析
lazy
选项的作用:lazy
设置为true
时,useAsyncData
不会在组件首次加载时立即执行。相反,它会在组件实际需要这个数据的时候(通常是在某个特定的渲染或计算属性中被引用时)才执行。useAsyncData
返回的数据(或者这个引用是在某些条件下才发生的),那么数据可能不会被加载。路由跳转与直接刷新的区别:
useAsyncData
被设置为lazy
,那么它可能不会立即执行,除非组件内部有某种方式触发了数据的加载。解决方案
移除
lazy
选项:lazy
选项。去掉lazy: true
,这样useAsyncData
就会在组件加载时立即执行。确保数据被正确引用:
useAsyncData
返回的数据。如果数据没有被引用,即使去掉了lazy
选项,useAsyncData
也可能不会执行。使用
onMounted
生命周期钩子:onMounted
钩子在客户端渲染时很有用,但它对于服务端渲染或静态生成并不起作用。因此,不应该依赖onMounted
来触发useAsyncData
的执行。相反,你应该让useAsyncData
直接在组件加载时执行(即去掉lazy
选项)。修改后的代码可能如下:
注意,我在模板中添加了
v-if
和v-else
来处理数据加载中的状态。这样,当数据还没有加载完成时,用户会看到“加载中...”的提示。一旦数据加载完成,res.data.value
将包含你的数据,并且会被渲染到页面上。