Опции компонента
asyncData и fetch
Nuxt 3 предоставляет новые опции для получения данных из API.
Изоморфное получение
В Nuxt 2 вы могли использовать @nuxtjs/axios или @nuxt/http для получения данных — или просто глобальный fetch, заполненный полифиллами.
В Nuxt 3 доступны глобальный fetch с API, как у Fetch API, и $fetch на базе 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 }
},
// или альтернативного
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 для простого запроса к эндпоинту.Миграция
- Замените хук
asyncDataнаuseAsyncDataилиuseFetchв вашей странице/компоненте. - Замените хук
fetchнаuseAsyncDataилиuseFetchв вашем компоненте.
head
key
Теперь вы можете определить ключ внутри макроса компилятора definePageMeta.
- <script>
- export default {
- key: 'index'
- // или функция
- // key: route => route.fullPath
- }
+ <script setup>
+ definePageMeta({
+ key: 'index'
+ // или функция
+ // key: route => route.fullPath
+ })
+ </script>
layout
loading
Эта функция пока не поддерживается в Nuxt 3.
middleware
scrollToTop
Эта функция пока не поддерживается в Nuxt 3. Чтобы переопределить стандартное поведение прокрутки vue-router, настройте ~/app/router.options.ts — см. документацию по параметрам маршрутизатора.
Подобно key, укажите это внутри макроса компилятора definePageMeta.
- <script>
- export default {
- scrollToTop: false
- }
+ <script setup>
+ definePageMeta({
+ scrollToTop: false
+ })
+ </script>
transition
validate
Хук validate в Nuxt 3 принимает только один аргумент — 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. Вместо этого вы можете непосредственно использовать watch для повторного получения данных.
<script setup lang="ts">
const route = useRoute()
const { data, refresh } = await useFetch('/api/user')
watch(() => route.query, () => refresh())
</script>