Опции компонента

Узнайте, как мигрировать с опций компонентов Nuxt 2 на композаблы Nuxt 3.

asyncData и fetch

Nuxt 3 предоставляет новые опции для получения данных из API.

Изоморфное получение

В Nuxt 2 вы могли использовать @nuxtjs/axios или @nuxt/http для получения данных — или просто глобальный fetch, заполненный полифиллами.

В Nuxt 3 доступны глобальный fetch с API, как у Fetch API, и $fetch на базе unjs/ofetch. Среди плюсов:

  1. На сервере удобно делать прямые вызовы 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 }
  },
  // или альтернативного
  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()` и т.д.
const { data: post, refresh } = await useAsyncData('post', () => $fetch(`https://api.nuxtjs.dev/posts/${params.id}`))
// Альтернатива: useFetch — обёртка над useAsyncData для простого HTTP-запроса к URL
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 в вашем компоненте.
Узнать больше 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 > 3 X > Getting Started > Transitions.

validate

Хук 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. Вместо этого вы можете непосредственно использовать watch для повторного получения данных.

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