组件选项
asyncData
和 fetch
Nuxt 3 提供了新的选项用于 从 API 获取数据。
同构 Fetch
在 Nuxt 2 中,您可能使用 @nuxtjs/axios
或 @nuxt/http
来获取数据 - 或者直接使用全局的 polyfilled fetch
。
在 Nuxt 3 中,您可以使用一个全局可用的 fetch
方法,它与 Fetch API 有相同的 API,或使用 $fetch
方法,该方法使用 unjs/ofetch。它有许多好处,包括:
- 它会“智能地”处理 直接 API 调用,如果在服务器上运行,则直接调用 API,或者如果在客户端运行,则调用您的 API。(它也可以处理调用第三方 API。)
- 此外,它还包含便利功能,包括自动解析响应和将数据字符串化。
组合式 API
Nuxt 3 提供了新的组合式 API 用于获取数据:useAsyncData
和 useFetch
。每个都有“懒惰”变体(useLazyAsyncData
和 useLazyFetch
),它们不会阻塞客户端导航。
在 Nuxt 2 中,您可以使用类似于以下语法在组件中获取数据:
export default {
async asyncData({ params, $http }) {
const post = await $http.$get(`https://api.nuxtjs.dev/posts/${params.id}`)
return { post }
},
// 或者替代方案
fetch () {
this.post = await $http.$get(`https://api.nuxtjs.dev/posts/${params.id}`)
}
}
在您的方法和模板中,您可以使用 post
变量,类似于您使用组件提供的任何其他数据。
在 Nuxt 3 中,您可以在 setup()
方法或 <script setup>
标签中使用组合式 API 执行此数据获取:
<script setup lang="ts">
// 在任何位置定义 params,例如通过 `defineProps()`、`useRoute()` 等等。
const { data: post, refresh } = await useAsyncData('post', () => $fetch(`https://api.nuxtjs.dev/posts/${params.id}`) )
// 或者 - useFetch 是用于简单获取数据的 convenience wrapper
const { data: post, refresh } = await useFetch(`https://api.nuxtjs.dev/posts/${params.id}`)
</script>
您现在可以在 Nuxt 3 模板中使用 post
,或者调用 refresh
来更新数据。
useFetch
并不是 fetch()
钩子的直接替代品。相反,useAsyncData
替代了两个钩子,并且更可自定义;它可以做的不仅仅是从端点获取数据。useFetch
是一个 convenience wrapper,围绕 useAsyncData
用于简单地从端点获取数据。迁移
- 在您的页面/组件中用
useAsyncData
或useFetch
替换asyncData
钩子。 - 在您的组件中用
useAsyncData
或useFetch
替换fetch
钩子。
head
key
您现在可以在 definePageMeta
编译宏中定义一个 key。
- <script>
- export default {
- key: 'index'
- // 或一个方法
- // key: route => route.fullPath
- }
+ <script setup>
+ definePageMeta({
+ key: 'index'
+ // 或一个方法
+ // key: route => route.fullPath
+ })
</script>
layout
loading
此功能在 Nuxt 3 中尚不支持。
middleware
scrollToTop
此功能在 Nuxt 3 中尚不支持。如果您想覆盖 vue-router
的默认滚动行为,可以在 ~/app/router.options.ts
中进行设置(有关更多信息,请参见 docs)。与 key
类似,可以在 definePageMeta
编译宏中指定。
- <script>
- export default {
- scrollToTop: false
- }
+ <script setup>
+ definePageMeta({
+ scrollToTop: false
+ })
</script>
transition
validate
在 Nuxt 3 中,validate 钩子只接受一个参数,即 route
。就像在 Nuxt 2 中一样,您可以返回一个布尔值。如果返回 false 且找不到其他匹配项,则意味着 404。您还可以直接返回一个包含 statusCode
/statusMessage
的对象,以立即响应错误(不会检查其他匹配项)。
- <script>
- export default {
- async validate({ params }) {
- return /^\d+$/.test(params.id)
- }
- }
+ <script setup>
+ definePageMeta({
+ validate: async (route) => {
+ const nuxtApp = useNuxtApp()
+ return /^\d+$/.test(route.params.id)
+ }
+ })
</script>
watchQuery
在 Nuxt 3 中不支持此功能。相反,您可以直接使用观察者来触发数据的重新获取。
<script setup lang="ts">
const route = useRoute()
const { data, refresh } = await useFetch('/api/user')
watch(() => route.query, () => refresh())
</script>