组件选项

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

Maschinelle Übersetzung ·0 % geprüft

asyncData 和 fetch

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

同构 Fetch

在 Nuxt 2 中你可能会使用 @nuxtjs/axios 或 @nuxt/http 来获取数据,或者直接使用被 polyfill 的全局 fetch。

在 Nuxt 3 中,你可以使用全局可用的 fetch 方法,它的 API 与 Fetch API 相同;也可以使用 $fetch 方法,该方法使用了 unjs/ofetch。它有许多优点,包括:

  1. 如果在服务器上运行,它会智能地处理直接 API 调用;如果在客户端上运行,则会向你的 API 发起客户端调用。(它也可以处理对第三方 API 的调用。)
  2. 并且,它提供了一些便捷功能,包括自动解析响应和将数据序列化为字符串等。

你可以阅读更多关于直接 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 }
  },
  // oder alternativ
  fetch () {
    this.post = await $http.$get(`https://api.nuxtjs.dev/posts/${params.id}`)
  },
}

在你的方法和模板中,你可以像使用组件提供的其他数据一样使用 post 变量。

在 Nuxt 3 中,你可以在 setup() 方法或 <script setup> 标签中使用组合式函数来执行此数据获取:

<script setup lang="ts">
// Definiere Parameter beliebig, etwa über `defineProps()`, `useRoute()` usw.
const { data: post, refresh } = await useAsyncData('post', () => $fetch(`https://api.nuxtjs.dev/posts/${params.id}`))
// Oder alternativ: useFetch ist ein praktischer Wrapper um useAsyncData, wenn du nur einen einfachen Abruf durchführst
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 钩子替换为 useAsyncData 或 useFetch。
  2. 在组件中,将 fetch 钩子替换为 useAsyncData 或 useFetch。
Weitere Informationen findest du unter Docs > Migration > Meta.

key

现在,你可以在 definePageMeta 编译器宏中定义 key。

app/pages/index.vue
- <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

Weitere Informationen findest du unter Docs > Migration > Pages And Layouts.

loading

此功能在 Nuxt 3 中尚不受支持。

middleware

Weitere Informationen findest du unter Docs > Migration > Plugins And Middleware.

scrollToTop

Nuxt 3 中尚不支持此功能。如果你想覆盖 vue-router 的默认滚动行为,可以在 ~/router.options.ts 中进行设置(更多信息请参阅文档)。 与 key 类似,在 definePageMeta 编译器宏中指定它。

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

transition

Weitere Informationen findest du unter Docs > Getting Started > Transitions.

validate

Nuxt 3 中的 validate 钩子只接受单个参数,即 route。与 Nuxt 2 一样,你可以返回布尔值。如果返回 false 且无法找到其他匹配项,则会导致 404。你也可以直接返回带有 statusCode/statusMessage 的对象以立即响应错误(不会检查其他匹配项)。

app/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 来触发数据的重新获取。

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