组件选项
asyncData
和 fetch
Nuxt 3 提供了用于从 API 获取数据的新选项。
同构 Fetch
在 Nuxt 2 中,你可能会使用 @nuxtjs/axios
或 @nuxt/http
来获取数据 - 或者只是填充全局的 fetch
。
在 Nuxt 3 中,你可以使用一个全局可用的 fetch
方法,它与Fetch API或 $fetch
方法具有相同的 API,它使用unjs/ofetch。它有许多优点,包括
- 如果它在服务器上运行,它会“智能地”处理直接 API 调用,或者如果它在客户端运行,则会向你的 API 发出客户端调用。(它还可以处理调用第三方 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
的一个方便的包装器,用于简单地从端点获取数据。迁移
- 将页面/组件中的
asyncData
钩子替换为useAsyncData
或useFetch
。 - 将组件中的
fetch
钩子替换为useAsyncData
或useFetch
。
head
key
你现在可以在 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
loading
此功能在 Nuxt 3 中尚不支持。
middleware
scrollToTop
此功能在 Nuxt 3 中尚不支持。如果你想覆盖 vue-router
的默认滚动行为,你可以在 ~/router.options.ts
中进行(详见文档)。类似于 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 不支持此功能。你可以直接使用 watcher 来触发数据重新获取。
<script setup lang="ts">
const route = useRoute()
const { data, refresh } = await useFetch('/api/user')
watch(() => route.query, () => refresh())
</script>