在 Nuxt 3 中使用 $fetch、useAsyncData 或 useFetch 来处理 GET 和 POST 请求?

Ste*_*eve 2 laravel fetch-api nuxt.js nuxtjs3

我将 Nuxt 3 与 Laravel API 后端一起使用,并尝试找出哪个可组合项useAsyncDatauseFetch,或者只是$fetch我应该用于 CRUD 和身份验证中的不同 API 请求。

文档说:

useFetch 是在组件设置函数中处理数据获取的最直接的方法。另一方面,当想要基于用户交互发出网络请求时,$fetch 几乎总是正确的处理程序。

但是,在组件中使用 $fetch 而不用 useAsyncData 包装它会导致两次获取数据:首先在服务器上,然后在水合作用期间再次在客户端上,因为 $fetch 不会将状态从服务器传输到客户端。因此,由于客户端必须再次获取数据,因此双方都会执行 fetch。我们建议在获取组件数据时使用 useFetch 或 useAsyncData + $fetch 来防止重复获取数据。

您可以将 $fetch 用于仅在客户端执行的任何方法。

POST我在文档中看到的唯一请求示例使用$fetch. 几乎所有其他示例都是GET使用 的请求useFetch

这是否意味着useFetch通常应该用于GET请求和$fetchforPOSTPUT请求?

我很困惑,因为我看过很多关于POST使用 requestsuseFetchGETrequests that use的教程$fetch

它是否更容易用于useFetch所有请求,因为它有很多$fetch没有的参数、选项和返回值,并且还因为它避免了在组件中两次获取数据的风险?

无论如何, 和 的错误处理useFetch是否$fetch相同useAsyncData?我可以在所有 3 个 API 中使用与 Fetch API 相同的错误处理吗?

Rea*_*gan 5

何时使用useFetch

\n

useFetch根据文档推荐的使用方式是在组件设置函数、插件和路由中间件中。这是一种处理数据获取的直接方法,无需重新获取或重复的网络调用,并且它是useAsyncData+的快捷方式$fetch

\n

\r\n
\r\n
// useAsyncData\nconst { data } = await useAsyncData(\'item\', () => $fetch(\'/api/item\'))\n\n// useFetch \xe2\x9c\x85 Cleaner and easy to read.\nconst { data } = await useFetch(\'/api/item\')
Run Code Online (Sandbox Code Playgroud)\r\n
\r\n
\r\n

\n

\n

useAsyncData是一个可组合项,旨在在设置函数、插件或路由中间件中直接调用。它返回反应式可组合项并处理向 Nuxt 有效负载添加响应,以便它们可以从服务器传递到客户端,而无需在页面水合时重新获取客户端的数据。

\n
\n

useAsyncData文档

\n
\n

useFetch是一个可组合项,旨在在设置函数、插件或路由中间件中直接调用。它返回反应式可组合项并处理向 Nuxt 有效负载添加响应,以便它们可以从服务器传递到客户端,而无需在页面水合时重新获取客户端的数据。

\n
\n

useFetch文档

\n

那么,什么时候使用$fetch

\n

根据文档,建议使用$fetchAPI 的方式是将数据发布到事件处理程序。

\n

例如

\n

\r\n
\r\n
<script setup lang="ts">\nfunction contactForm() {\n  $fetch(\'/api/contact\', {\n    method: \'POST\',\n    body: { hello: \'world \'}\n  })\n}\n</script>\n\n<template>\n  <button @click="contactForm">Contact</button>\n</template>
Run Code Online (Sandbox Code Playgroud)\r\n
\r\n
\r\n

\n

您还可以$fetch在服务器/服务器路由上使用 API。\ne.g.

\n

\r\n
\r\n
export default defineEventHandler(async () => {\n    const sendEmail = await $fetch(\'https//send-email.com/api/send-email\')\n    return sendEmail\n})
Run Code Online (Sandbox Code Playgroud)\r\n
\r\n
\r\n

\n

这是基于 nuxt 文档的这些可组合项/API 的推荐用法。但是,就我个人的使用而言,useFetch用于发布数据仍然可以正常工作。只是不推荐而已。

\n

对于错误处理,根据文档,它应该相同,因为它们返回相同的值,例如数据、挂起、刷新/执行和状态。

\n

查看aysncData返回值

\n

查看useFetch返回值

\n

希望有帮助。

\n

  • 您可以使用 `$fetch` 或 `useFetch` 来实现这些,是的。但对于 `$fetch` 来说,它保证是一个“一次性”调用。例如,当发送 POST 请求时,“useFetch”可能会产生不必要的副作用 - 因为如果依赖项(例如用户名)发生更改,它将再次发送请求。 (6认同)
  • Nuxt 团队成员在这里。值得注意的是,“useFetch”是反应性的(因此当依赖项发生变化时会重新触发),并且可能会发送比想要的更多的请求。这可能是不期望的行为(例如,在第一次请求由于密码错误而失败后,每次击键都提交登录表单时)。 (5认同)