组件选项

了解如何从 Nuxt 2 的组件选项迁移到 Nuxt 3 的可组合函数。

asyncDatafetch

Nuxt 3 提供了新的选项用于从 API 获取数据

同构 Fetch

在 Nuxt 2 中,您可能使用 @nuxtjs/axios@nuxt/http 来获取数据,或者使用 polyfill 的全局 fetch

在 Nuxt 3 中,您可以使用全局可用的 fetch 方法,它具有与 Fetch API 相同的 API,或者使用基于 unjs/ofetch$fetch 方法。它有以下优点:

  1. 它会“智能地”处理请求:如果在服务器端运行,则直接调用 API;如果在客户端运行,则通过客户端调用您的 API。(它还可以处理调用第三方 API。)
  2. 此外,它还提供了一些便利功能,包括自动解析响应和序列化数据。

您可以阅读更多关于直接 API 调用数据获取的内容。

可组合函数

Nuxt 3 提供了用于获取数据的新可组合函数:useAsyncDatauseFetch。它们各有“惰性”变体(useLazyAsyncDatauseLazyFetch),这些变体不会阻塞客户端导航。

在 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> 标签中使用可组合函数进行数据获取:

<script setup lang="ts">
// 通过 `defineProps()`、`useRoute()` 等定义 params
const { data: post, refresh } = await useAsyncData('post', () => $fetch(`https://api.nuxtjs.dev/posts/${params.id}`) )
// 或者更简单——useFetch 是对 useAsyncData 的便捷封装,仅用于简单的数据获取
const { data: post, refresh } = await useFetch(`https://api.nuxtjs.dev/posts/${params.id}`)
</script>

您现在可以在 Nuxt 3 模板中使用 post,或调用 refresh 来更新数据。

尽管名称相似,useFetch 并不是 fetch() 钩子的直接替代品。相反,useAsyncData 取代了这两个钩子,且更具可定制性;它不仅限于从端点获取数据。useFetch 是对 useAsyncData 的便捷封装,专为从端点简单获取数据设计。

迁移

  1. asyncData 钩子替换为页面/组件中的 useAsyncDatauseFetch
  2. fetch 钩子替换为组件中的 useAsyncDatauseFetch
阅读更多 Docs > Migration > Meta.

key

您现在可以在 definePageMeta 编译宏中定义一个键。

pages/index.vue
- <script>
- export default {
-   key: 'index'
-   // 或一个方法
-   // key: route => route.fullPath
- }
+ <script setup>
+ definePageMeta({
+   key: 'index'
+   // 或一个方法
+   // key: route => route.fullPath
+ })
</script>

layout

阅读更多 Docs > Migration > Pages And Layouts.

loading

Nuxt 3 尚未支持此功能。

middleware

阅读更多 Docs > Migration > Plugins And Middleware.

scrollToTop

Nuxt 3 尚未支持此功能。如果您想覆盖 vue-router 的默认滚动行为,可以在 ~/app/router.options.ts 中进行设置(详情见文档)。 与 key 类似,您可以在 definePageMeta 编译宏中指定它。

pages/index.vue
- <script>
- export default {
-   scrollToTop: false
- }
+ <script setup>
+ definePageMeta({
+   scrollToTop: false
+ })
</script>

transition

阅读更多 Docs > Getting Started > Transitions.

validate

Nuxt 3 的验证钩子只接受一个参数 route。与 Nuxt 2 相同,您可以返回一个布尔值。如果返回 false 且找不到其他匹配项,将触发 404。您也可以直接返回一个包含 statusCode/statusMessage 的对象,以立即响应错误(不会检查其他匹配项)。

pages/users/[id].vue
- <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 来触发数据重新获取。

pages/users/[id].vue
<script setup lang="ts">
const route = useRoute()
const { data, refresh } = await useFetch('/api/user')
watch(() => route.query, () => refresh())
</script>