Содержание
В Nuxt есть несколько встроенных инструментов для механизма получения данных. Это может ввести в заблуждение тех, кто только начинает знакомиться с этим фреймворком.
Чаще всего, вы будете иметь дело с функциями:
- useFetch
- $fetch
Но, также может встречаться
- useAsyncData
Что же это за набор инструментов? Давайте будем разбираться.
Функции $fetch, useFetch и useAsyncData
Эти функции также называют в документации составными или композиционными. Дело в том, что они берут стандартный функционал fetch для выполнения запросов в Javascript и Nuxt накладывает на них дополнительный функционал.
Зачем нужно было создавать эти дополнительные функции?
Дело в том, что код, который обрабатывает Nuxt может выполняться как на клиентской, так и на серверной стороне. Подробнее об этом я рассказывал в базовом курсе по Nuxt:
https://webkyrs.info/category/osnovy-nuxt
и в курсе по работе с Server API Nuxt
https://webkyrs.info/category/rabota-s-server-api-v-nuxt
Нужны были функции, которые бы учитывали особенности выполнения кода (рендеринга Vue компонентов) в обоих этих средах. Стандартная функция fetch для этих целей не подходила. Если использовать ее, получение данных может происходить 2 раза: на сервере и клиенте.
Нужны были функции, которые бы учитывали эти особенности получения данных для режима Server Side Rendering. Именно поэтому в Nuxt и появились эти дополнительные функции для получения данных.
Функция $fetch
Это основной инструмент для выполнения сетевых запросов в Nuxt. По сути, это обертка (compose) над стандартной javascript функцией fetch (без знака доллара).
$fetch - это алиас (знак доллара) библиотеки ofetch
https://github.com/unjs/ofetch
и это глобально импортировано в Nuxt проект, чтобы мы могли пользоваться этим в любом месте.
Мы можем использовать $fetch напрямую в компонентах
<script setup lang="ts"> async function addProduct() { const product = await $fetch('/api/products', { method: 'POST', body: { name: 'Product Name', price: 100, description: 'Product Description', category: 'Category Name' } }) } </script>
Также это может использоваться в server api файлах
// server/api/products.ts export default defineEventHandler(async (event) => { const body = await readBody(event); // Пример отправки данных на внешний API с помощью $fetch const response = await $fetch('https://external-api.com/products', { method: 'POST', body: { name: body.name, price: body.price, description: body.description, category: body.category } }); return { status: 'success', message: 'Product added successfully', product: response }; });
Функция useFetch
В отличии от $fetch, функцию useFetch мы можем использовать только в компонентах и не можем использовать в Server API.
useFetch не выполняет непосредственно сам запрос, а служит хуком, которая вызовет серверную функцию, которая сделает сам сетевой запрос с помощью функции $fetch.
<script setup lang="ts"> const { data: product, pending, error } = await useFetch('/api/products', { method: 'POST', body: { name: 'New Product', price: 150, description: 'A new product description', category: 'Category Name' } }) </script>
Этот код вызовет серверный endpoint, где и будет выполнен непосредственный запрос с помощью функции $fetch.
На самом деле, функция useFetch - это "синтаксический сахар" для более простой записи конструкции:
useFetch(url) - эквивалентно useAsyncData(url, () => $fetch(url))
Используя функцию useAsyncData вы можете более гибко настроить механизм выполнения запроса.
Таким образом, мы видим, что useFetch - это обертка над оберткой useAsyncData, которая позволяет перенаправить запрос к $fetch и дождаться результатов выполнения запроса и далее мы уже можем выполнить обработку данных.
Использование функции useAsyncData может выглядеть следующим образом.
const { data, error } = await useAsyncData('getTodos', () => fetchTodos())
В useAsyncData первый аргумент - это уникальный ключ для кэширования ответа, полученного от второго аргумента, который является функцией запроса. Однако, если вам удобнее, вы можете опустить этот аргумент и передать только функцию запроса. В таком случае уникальный ключ будет сгенерирован автоматически.
Итого
Вы можете посмотреть больше примеров, как эти запросы применяются на практике в моем курсе по Server API Nuxt
https://webkyrs.info/category/rabota-s-server-api-v-nuxt
Чаще всего в компонентах мы используем хук useFetch, который уже на server api будет вызывать алиас $fetch.
Вот такой алгоритм работы.
Чтобы оставить сообщение, зарегистрируйтесь/войдите на сайт через:
Email - зарегистрироваться / войти