Введение
Начинаете новый React проект, но backend еще не готов? Не хотите ждать неделями, пока API будет разработан? В этом туториале вы создадите полноценное Todo приложение на React с API интеграцией за 15 минут — без единой строки backend кода.
✅ Что вы получите в конце:
- ✅ Рабочее Todo приложение с полным CRUD функционалом
- ✅ React + TypeScript + Vite (современный стек)
- ✅ Интеграция с Mock API (реальные HTTP запросы)
- ✅ React Query для кэширования и управления состоянием
- ✅ Обработка ошибок и loading states
- ✅ Deploy на Vercel (готово к продакшену)
- ✅ Полный исходный код на GitHub
💡 Для кого этот туториал:
- Начинающие React разработчики: Изучите работу с API
- Опытные разработчики: Ускорьте прототипирование
- Frontend команды: Не ждите backend, начните прямо сейчас
- Студенты: Создайте портфолио проект за 15 минут
📋 План действий (15 минут)
- Что мы создадим (1 мин)
- Шаг 1: Setup проекта (2 мин)
- Шаг 2: Создание Mock API (3 мин)
- Шаг 3: Настройка HTTP клиента (2 мин)
- Шаг 4: CRUD операции (4 мин)
- Шаг 5: React Query интеграция (2 мин)
- Шаг 6: Error Handling (1 мин)
- Шаг 7: Deploy на Vercel (1 мин)
Что мы создадим 🎯
Мы создадим классическое Todo приложение с полноценным API. Это идеальный проект для изучения, так как он включает все основные операции:
| Функция | API Endpoint | Метод |
|---|---|---|
| Получить все задачи | GET /todos |
Read |
| Создать задачу | POST /todos |
Create |
| Обновить задачу | PUT /todos/:id |
Update |
| Удалить задачу | DELETE /todos/:id |
Delete |
Технологический стек
- React 18 — UI библиотека
- TypeScript — Типизация
- Vite — Сборщик (быстрее Webpack)
- Axios — HTTP клиент
- React Query (TanStack Query) — Управление server state
- LightBox API — Mock API платформа
Шаг 1: Setup проекта (2 минуты)
1 Создайте React приложение с Vite
# Создаем проект
npm create vite@latest todo-app -- --template react-ts
# Переходим в директорию
cd todo-app
# Устанавливаем зависимости
npm install
# Устанавливаем дополнительные библиотеки
npm install axios @tanstack/react-query
2 Структура проекта
todo-app/
├── src/
│ ├── api/
│ │ └── todos.ts # API функции
│ ├── components/
│ │ ├── TodoList.tsx # Список задач
│ │ ├── TodoItem.tsx # Одна задача
│ │ └── AddTodo.tsx # Форма добавления
│ ├── types/
│ │ └── todo.ts # TypeScript типы
│ ├── App.tsx # Главный компонент
│ └── main.tsx # Entry point
├── package.json
└── vite.config.ts
Шаг 2: Создание Mock API (3 минуты)
1 Зарегистрируйтесь на LightBox API
Перейдите на lightboxapi.ru и создайте бесплатный аккаунт.
2 Создайте workspace
В dashboard создайте новый workspace с именем todo-app.
3 Настройте endpoints
Endpoint 1: GET /todos
{
"todos": [
{
"id": "1",
"title": "Изучить React Query",
"completed": false,
"createdAt": "2025-10-21T10:00:00Z"
},
{
"id": "2",
"title": "Интегрировать Mock API",
"completed": true,
"createdAt": "2025-10-21T09:00:00Z"
}
]
}
Endpoint 2: POST /todos
{
"id": "{randomUUID}",
"title": "{body.title}",
"completed": false,
"createdAt": "{$timestamp}"
}
Endpoint 3: PUT /todos/:id
{
"id": "{params.id}",
"title": "{body.title}",
"completed": {body.completed},
"updatedAt": "{$timestamp}"
}
Endpoint 4: DELETE /todos/:id
{
"success": true,
"message": "Todo deleted"
}
✅ Готово!
Ваш Mock API готов. URL будет выглядеть так:
https://yourdomain.lightboxapi.ru/todos
Шаг 3: Настройка HTTP клиента (2 минуты)
1 Создайте типы TypeScript
// src/types/todo.ts
export interface Todo {
id: string;
title: string;
completed: boolean;
createdAt: string;
updatedAt?: string;
}
export interface CreateTodoDTO {
title: string;
}
export interface UpdateTodoDTO {
title?: string;
completed?: boolean;
}
2 Настройте Axios
// src/api/client.ts
import axios from 'axios';
const API_URL = 'https://yourdomain.lightboxapi.ru';
export const apiClient = axios.create({
baseURL: API_URL,
headers: {
'Content-Type': 'application/json',
},
});
// Можно добавить interceptors для логирования
apiClient.interceptors.request.use((config) => {
console.log('API Request:', config.method?.toUpperCase(), config.url);
return config;
});
apiClient.interceptors.response.use(
(response) => {
console.log('API Response:', response.status, response.data);
return response;
},
(error) => {
console.error('API Error:', error.message);
return Promise.reject(error);
}
);
Шаг 4: CRUD операции (4 минуты)
1 Создайте API функции
// src/api/todos.ts
import { apiClient } from './client';
import { Todo, CreateTodoDTO, UpdateTodoDTO } from '../types/todo';
// GET /todos - Получить все задачи
export const getTodos = async (): Promise => {
const response = await apiClient.get<{ todos: Todo[] }>('/todos');
return response.data.todos;
};
// POST /todos - Создать задачу
export const createTodo = async (data: CreateTodoDTO): Promise => {
const response = await apiClient.post('/todos', data);
return response.data;
};
// PUT /todos/:id - Обновить задачу
export const updateTodo = async (
id: string,
data: UpdateTodoDTO
): Promise => {
const response = await apiClient.put(`/todos/${id}`, data);
return response.data;
};
// DELETE /todos/:id - Удалить задачу
export const deleteTodo = async (id: string): Promise => {
await apiClient.delete(`/todos/${id}`);
};
Шаг 5: React Query интеграция (2 минуты)
1 Настройте QueryClient
// src/main.tsx
import React from 'react';
import ReactDOM from 'react-dom/client';
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
import { ReactQueryDevtools } from '@tanstack/react-query-devtools';
import App from './App';
import './index.css';
const queryClient = new QueryClient({
defaultOptions: {
queries: {
refetchOnWindowFocus: false,
retry: 1,
staleTime: 5 * 60 * 1000, // 5 минут
},
},
});
ReactDOM.createRoot(document.getElementById('root')!).render(
);
2 Создайте Custom Hooks
// src/hooks/useTodos.ts
import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
import {
getTodos,
createTodo,
updateTodo,
deleteTodo,
} from '../api/todos';
import { CreateTodoDTO, UpdateTodoDTO } from '../types/todo';
// Hook для получения всех задач
export const useTodos = () => {
return useQuery({
queryKey: ['todos'],
queryFn: getTodos,
});
};
// Hook для создания задачи
export const useCreateTodo = () => {
const queryClient = useQueryClient();
return useMutation({
mutationFn: (data: CreateTodoDTO) => createTodo(data),
onSuccess: () => {
// Обновляем список задач
queryClient.invalidateQueries({ queryKey: ['todos'] });
},
});
};
// Hook для обновления задачи
export const useUpdateTodo = () => {
const queryClient = useQueryClient();
return useMutation({
mutationFn: ({ id, data }: { id: string; data: UpdateTodoDTO }) =>
updateTodo(id, data),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ['todos'] });
},
});
};
// Hook для удаления задачи
export const useDeleteTodo = () => {
const queryClient = useQueryClient();
return useMutation({
mutationFn: (id: string) => deleteTodo(id),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ['todos'] });
},
});
};
3 Используйте в компонентах
// src/App.tsx
import { useState } from 'react';
import {
useTodos,
useCreateTodo,
useUpdateTodo,
useDeleteTodo,
} from './hooks/useTodos';
import './App.css';
function App() {
const [newTodoTitle, setNewTodoTitle] = useState('');
// Queries
const { data: todos, isLoading, error } = useTodos();
// Mutations
const createMutation = useCreateTodo();
const updateMutation = useUpdateTodo();
const deleteMutation = useDeleteTodo();
const handleAddTodo = (e: React.FormEvent) => {
e.preventDefault();
if (newTodoTitle.trim()) {
createMutation.mutate({ title: newTodoTitle });
setNewTodoTitle('');
}
};
const handleToggle = (id: string, completed: boolean) => {
updateMutation.mutate({ id, data: { completed: !completed } });
};
const handleDelete = (id: string) => {
deleteMutation.mutate(id);
};
if (isLoading) return Загрузка...;
if (error) return Ошибка: {error.message};
return (
📝 Todo App
{/* Форма добавления */}
{/* Список задач */}
{todos?.map((todo) => (
handleToggle(todo.id, todo.completed)}
disabled={updateMutation.isPending}
/>
{todo.title}
))}
{todos?.length === 0 && (
Нет задач. Добавьте первую!
)}
);
}
export default App;
Шаг 6: Error Handling (1 минута)
1 Добавьте Toast уведомления
npm install react-hot-toast
// src/main.tsx
import { Toaster } from 'react-hot-toast';
// В рендер добавьте:
<>
>
// src/hooks/useTodos.ts
import toast from 'react-hot-toast';
export const useCreateTodo = () => {
const queryClient = useQueryClient();
return useMutation({
mutationFn: (data: CreateTodoDTO) => createTodo(data),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ['todos'] });
toast.success('Задача добавлена');
},
onError: (error) => {
toast.error(`Ошибка: ${error.message}`);
},
});
};
Шаг 7: Deploy на Vercel (1 минута)
1 Подготовьте проект
# Инициализируйте git
git init
git add .
git commit -m "Initial commit"
# Загрузите на GitHub
git remote add origin https://github.com/yourusername/todo-app.git
git push -u origin main
2 Deploy на Vercel
- Перейдите на vercel.com
- Подключите GitHub репозиторий
- Нажмите Deploy
- Готово! Приложение доступно через 30 секунд
🎉 Поздравляем!
Вы создали и задеплоили полноценное React приложение с API интеграцией за 15 минут!
Что дальше? 🚀
Улучшите UI
Добавьте стили с помощью Tailwind CSS или Material-UI
Добавьте фильтры
Фильтрация по статусу: All / Active / Completed
Реализуйте поиск
Поиск задач по названию с debounce
Добавьте категории
Группировка задач по категориям (Work, Personal, Shopping)
Внедрите авторизацию
JWT токены, защищенные роуты, персональные задачи
Мигрируйте на real API
Когда backend готов, просто замените URL — всё остальное работает!
Полезные ссылки 📚
| Ресурс | Описание | Ссылка |
|---|---|---|
| React Query Docs | Официальная документация | tanstack.com/query |
| LightBox API | Mock API платформа | lightboxapi.ru |
| Vite Docs | Документация Vite | vitejs.dev |
| TypeScript Handbook | Изучение TypeScript | typescriptlang.org |
Сравнение подходов
| Подход | Время setup | Реалистичность | Готовность к prod |
|---|---|---|---|
| Mock API (LightBox) | ✅ 3 минуты | ✅ 100% реальные HTTP запросы | ✅ Легкая миграция |
| MSW (Mock Service Worker) | ⚠️ 10-15 минут | ✅ Хорошо | ⚠️ Нужно удалить перед prod |
| JSON Server | ✅ 5 минут | ✅ Хорошо | ⚠️ Только локально |
| useState (mock data) | ✅ 2 минуты | ❌ Не реалистично | ❌ Полная переписывание |
| Real Backend | ❌ 1-2 недели | ✅ 100% | ✅ Готово |
Преимущества Mock API для React проектов
✅ Для разработчиков:
- Не ждите backend: Начните разработку прямо сейчас
- Реальные HTTP запросы: Axios/Fetch работает как в production
- React Query сразу: Настраивайте кэширование с первого дня
- Легкая миграция: Замените URL — всё работает
- Командная работа: Весь стек использует один Mock API
✅ Для команды:
- Параллельная разработка: Frontend и Backend независимо
- Демо клиентам: Покажите рабочий прототип за день
- Тестирование: QA начинает тесты до готовности backend
- Документация API: Mock API = живая документация
Частые вопросы (FAQ)
❓ Можно ли использовать fetch вместо axios?
Ответ: Да! Просто замените axios на fetch:
export const getTodos = async (): Promise => {
const response = await fetch('https://yourdomain.lightboxapi.ru/todos');
const data = await response.json();
return data.todos;
};
❓ Как добавить авторизацию?
Ответ: Добавьте заголовок Authorization:
apiClient.interceptors.request.use((config) => {
const token = localStorage.getItem('token');
if (token) {
config.headers.Authorization = `Bearer ${token}`;
}
return config;
});
❓ Как мигрировать на real API?
Ответ: Замените только URL:
// Было:
const API_URL = 'https://yourdomain.lightboxapi.ru';
// Стало:
const API_URL = 'https://api.yourapp.com';
Всё остальное работает без изменений! 🎉
Заключение
🎯 Что вы изучили:
- ✅ Создали React приложение с TypeScript и Vite
- ✅ Настроили Mock API за 3 минуты
- ✅ Реализовали все CRUD операции
- ✅ Интегрировали React Query для state management
- ✅ Добавили error handling и loading states
- ✅ Задеплоили на Vercel
Время: 15 минут
Результат: Полноценное приложение готово к разработке
🚀 Готовы создать свой проект?
LightBox API — это Mock API платформа для быстрого прототипирования.
- ✓ Setup за 3 минуты
- ✓ Реальные HTTP запросы
- ✓ Логирование всех запросов
- ✓ Динамические ответы (UUID, timestamps)
- ✓ CORS настроен из коробки
- ✓ Бесплатный план для старта
Статья обновлена: 21 октября 2025
Автор: LightBox API Team