Для работы с HTTP-запросами в проектах на Vue.js и Naive UI чаще всего используют библиотеку Axios, которая предоставляет удобный интерфейс для выполнения запросов к API. Установка производится через npm или yarn:
npm install axios
# или
yarn add axios
После установки Axios можно импортировать в компоненты или создать отдельный модуль для централизованной работы с API:
import axios from 'axios';
const apiClient = axios.create({
baseURL: 'https://api.example.com',
timeout: 5000,
headers: {
'Content-Type': 'application/json'
}
});
export default apiClient;
Создание экземпляра apiClient позволяет задавать
общие настройки, которые будут применяться ко всем
запросам, включая базовый URL, таймаут и заголовки.
GET-запросы применяются для получения данных с сервера:
apiClient.get('/users')
.then(response => {
console.log(response.data);
})
.catch(error => {
console.error(error);
});
POST-запросы отправляют данные на сервер:
apiClient.post('/users', {
name: 'Иван',
email: 'ivan@example.com'
})
.then(response => {
console.log(response.data);
})
.catch(error => {
console.error(error);
});
Ключевой момент: Axios автоматически сериализует объект JavaScript в
JSON и устанавливает соответствующий заголовок
Content-Type: application/json.
Для интеграции с современным синтаксисом Vue 3 удобно использовать
async/await:
async function fetchUsers() {
try {
const response = await apiClient.get('/users');
console.log(response.data);
} catch (error) {
console.error(error);
}
}
Использование async/await упрощает обработку ошибок и
делает код более читаемым, особенно при последовательных запросах.
Axios поддерживает перехватчики запросов и ответов, что позволяет централизованно обрабатывать токены, логирование или обработку ошибок:
// Перехватчик запросов
apiClient.interceptors.request.use(config => {
const token = localStorage.getItem('token');
if (token) {
config.headers.Authorization = `Bearer ${token}`;
}
return config;
}, error => Promise.reject(error));
// Перехватчик ответов
apiClient.interceptors.response.use(response => response, error => {
if (error.response && error.response.status === 401) {
console.error('Неавторизованный доступ');
}
return Promise.reject(error);
});
Перехватчики позволяют централизованно управлять логикой авторизации и обработкой стандартных ошибок без дублирования кода в компонентах.
В Naive UI часто требуется отображение данных из API в компонентах,
таких как DataTable, Select или
Card. Например, для динамического списка пользователей
в n-data-table:
<template>
<n-data-table :columns="columns" :data="users" />
</template>
<script setup>
import { ref, onMounted } from 'vue';
import apiClient from './apiClient';
const users = ref([]);
const columns = [
{ title: 'Имя', key: 'name' },
{ title: 'Email', key: 'email' }
];
onMounted(async () => {
try {
const response = await apiClient.get('/users');
users.value = response.data;
} catch (error) {
console.error(error);
}
});
</script>
Важно, что ref используется для реактивного хранения
данных, а Naive UI автоматически реагирует на их изменение.
Naive UI предоставляет компонент n-notification для
отображения сообщений пользователю. При интеграции с Axios это позволяет
удобно информировать о результатах запросов:
import { useNotification } from 'naive-ui';
const notification = useNotification();
try {
const response = await apiClient.post('/users', newUser);
notification.success({
title: 'Успех',
content: `Пользователь ${response.data.name} добавлен`
});
} catch (error) {
notification.error({
title: 'Ошибка',
content: error.response?.data?.message || 'Не удалось выполнить запрос'
});
}
Таким образом, Axios и Naive UI работают в связке: Axios отвечает за получение и отправку данных, Naive UI за визуализацию и информирование пользователя.
Часто необходимо выполнять несколько запросов одновременно. Axios
позволяет использовать Promise.all:
const [usersRes, postsRes] = await Promise.all([
apiClient.get('/users'),
apiClient.get('/posts')
]);
console.log(usersRes.data, postsRes.data);
Такой подход экономит время и уменьшает задержки, особенно при работе с множеством независимых ресурсов.
Для контроля производительности и предотвращения долгих зависаний
можно использовать таймауты и AbortController:
const controller = new AbortController();
try {
const response = await apiClient.get('/users', {
signal: controller.signal,
timeout: 3000
});
console.log(response.data);
} catch (error) {
if (error.name === 'CanceledError') {
console.warn('Запрос отменён');
} else {
console.error(error);
}
}
// Отмена запроса через 2 секунды
setTimeout(() => controller.abort(), 2000);
Это важно для интерфейсов, где пользователь может быстро переключаться между страницами или компонентами.
При работе с Axios и Naive UI рекомендуется:
apiClient.js) с
базовым URL и перехватчиками.async/await для упрощения логики
асинхронных операций.ref,
reactive) для динамического обновления компонентов.Эти подходы позволяют построить стабильную и масштабируемую архитектуру фронтенда, где HTTP-запросы управляются централизованно, а визуальная часть компонента полностью интегрирована с Naive UI.