asyncData 和 fetchNuxt 3 提供了用于从 API 获取数据的新选项。
在 Nuxt 2 中,你可能使用 @nuxtjs/axios 或 @nuxt/http 来获取数据 - 或者只是全局的 polyfill fetch。
在 Nuxt 3 中,你可以使用全局可用的 fetch 方法,它具有与Fetch API相同的 API,或者使用 $fetch 方法,该方法使用了unjs/ofetch。它有许多优点,包括
你可以阅读更多关于直接 API 调用或获取数据的信息。
Nuxt 3 提供了新的组合式函数用于获取数据: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 }
},
// or alternatively
fetch () {
this.post = await $http.$get(`https://api.nuxtjs.dev/posts/${params.id}`)
},
}
在你的方法和模板中,你可以像使用组件提供的任何其他数据一样使用 post 变量。
在 Nuxt 3 中,你可以在 setup() 方法或 <script setup> 标签中使用组合式函数执行数据获取。
<script setup lang="ts">
// Define params wherever, through `defineProps()`, `useRoute()`, etc.
const { data: post, refresh } = await useAsyncData('post', () => $fetch(`https://api.nuxtjs.dev/posts/${params.id}`))
// Or instead - useFetch is a convenience wrapper around useAsyncData when you're just performing a simple fetch
const { data: post, refresh } = await useFetch(`https://api.nuxtjs.dev/posts/${params.id}`)
</script>
你现在可以在 Nuxt 3 模板中使用 post,或者调用 refresh 来更新数据。
useFetch 并不是 fetch() 钩子的直接替代品。相反,useAsyncData 替代了这两个钩子,并且更具可定制性;它不仅可以从端点获取数据。useFetch 是 useAsyncData 的便捷包装器,用于简单地从端点获取数据。useAsyncData 或 useFetch 替换 asyncData 钩子。useAsyncData 或 useFetch 替换 fetch 钩子。headkey你现在可以在 definePageMeta 编译器宏中定义一个键。
- <script>
- export default {
- key: 'index'
- // or a method
- // key: route => route.fullPath
- }
+ <script setup>
+ definePageMeta({
+ key: 'index'
+ // or a method
+ // key: route => route.fullPath
+ })
</script>
layout加载Nuxt 3 尚不支持此功能。
middlewarescrollToTopNuxt 3 尚不支持此功能。如果你想覆盖 vue-router 的默认滚动行为,你可以在 ~/router.options.ts 中进行(详见文档)。与 key 类似,在 definePageMeta 编译器宏中指定它。
- <script>
- export default {
- scrollToTop: false
- }
+ <script setup>
+ definePageMeta({
+ scrollToTop: false
+ })
</script>
transitionvalidateNuxt 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>
watchQueryNuxt 3 不支持此功能。你可以直接使用 watcher 来触发数据重新获取。
<script setup lang="ts">
const route = useRoute()
const { data, refresh } = await useFetch('/api/user')
watch(() => route.query, () => refresh())
</script>