返回

Nuxt3 中“useFetch”多重调用导致的错误:如何解决?

vue.js

Nuxt3 中修复“useFetch”多重调用导致的错误

问题

在 Nuxt3 应用程序中,在单个组件中调用多个 useFetch 函数可能会触发错误:

A composable that requires access to the Nuxt instance was called outside of a plugin, Nuxt hook, Nuxt middleware, or Vue setup function. This is probably not a Nuxt bug. Find out more at `https://nuxt.com/docs/guide/concepts/auto-imports#vue-and-nuxt-composables`.

这是因为 useFetch 需要访问 Nuxt 实例,而在组件 <script setup> 之外调用它时无法访问。

解决方案

1. 使用 asyncDatauseAsyncData

这些高阶函数在页面加载之前调用,并且拥有 Nuxt 实例的访问权限。将 useFetch 调用移动到这些函数中:

<script setup>
  async function fetchLectureData() {
    const { data } = await useFetch("/api/lecture", {
      // ...
    });
    // ...
  }

  async function load() {
    await fetchLectureData();
  }
</script>

2. 创建 Nuxt 插件

创建一个插件来封装 useFetch 调用并访问 Nuxt 实例:

插件

export default defineNuxtPlugin(() => {
  return {
    provide: {
      useFetch: useFetch,
    },
  };
});

组件

<script setup>
  // 初始化
  async function init() {
    const { data } = await useFetch("/api/lecture", {
      // ...
    });
    // ...
  }
  init();
</script>

其他注意事项

  • 正确解构和使用 useFetch 函数。
  • 在 Vue 生命周期钩子(如 mountedcreated)中调用 useFetch,以确保在 Nuxt 实例可用时执行。

结论

通过使用上述解决方案,你可以避免在 Nuxt3 应用程序中使用多个 useFetch 调用时遇到的错误。

常见问题解答

  1. 为什么会出现此错误?
    因为 useFetch 需要访问 Nuxt 实例,而组件 <script setup> 之外无法访问。

  2. asyncDatauseAsyncData 有什么区别?
    asyncData 在服务器端调用,而 useAsyncData 在客户端调用。

  3. 为什么需要创建 Nuxt 插件?
    插件允许你在组件中访问 Nuxt 实例,从而调用 useFetch

  4. 在 Vue 生命周期钩子中调用 useFetch 有什么好处?
    它确保在 Nuxt 实例可用时调用 useFetch

  5. 在 Nuxt3 中调用 useFetch 的最佳做法是什么?
    优先使用 asyncDatauseAsyncData,如果需要在组件 <script setup> 之外调用,则使用 Nuxt 插件。