Щоб закріпити знання Redux Toolkit та RTK Query, ми створимо повноцінний додаток — клон Trello. Це не просто "Todo list". Це складний додаток зі складною логікою переміщення карток, оптимістичними оновленнями та синхронізацією з сервером.
Ми будемо використовувати сучасний набір інструментів:
Це найважливіший етап. Якщо ми неправильно спроєктуємо структуру даних, нам буде дуже важко писати редюсери для Drag & Drop.
Наш бекенд повертає дані в такому форматі:
{
"columns": [
{
"id": "column-1",
"title": "To Do",
"taskIds": ["task-1", "task-2"] // Порядок завдань важливий!
},
{
"id": "column-2",
"title": "In Progress",
"taskIds": []
}
],
"tasks": [
{ "id": "task-1", "content": "Налаштувати Redux" },
{ "id": "task-2", "content": "Створити слайси" }
],
"columnOrder": ["column-1", "column-2"] // Порядок колонок
}
Ми будемо використовувати нормалізовану структуру для максимальної продуктивності. Завдання не будуть жити всередині колонок. Вони будуть жити окремо.
interface RootState {
// Кеш RTK Query для серверних даних
api: ApiState
// Локальний UI стан (наприклад, яка модалка відкрита)
ui: UiState
// Дані дошки (ми дублюємо їх тут для миттєвого Drag&Drop)
board: {
tasks: {
ids: string[]
entities: Record<string, Task>
}
columns: {
ids: string[]
entities: Record<string, Column>
}
columnOrder: string[]
}
}
Чому ми дублюємо дані в board slice, якщо вони вже є в кеші RTK Query?
Drag & Drop вимагає миттєвих синхронних оновлень локального стану. Кеш RTK Query призначений для синхронізації з сервером, і маніпулювати ним вручну для складних dnd-операцій може бути незручно.
Ми використаємо гібридний підхід:
board.board (миттєво).Це архітектура професійного рівня. Вона забезпечує ідеальну чутливість інтерфейсу (60 FPS) і надійність даних.
Архітектура та Best Practices
Тепер, коли ви знаєте всі інструменти Redux Toolkit, давайте поговоримо про те, як організувати код, щоб проєкт залишався підтримуваним навіть при зростанні.
Налаштування та Типізація
Почнемо з фундаменту. Нам потрібно встановити залежності та налаштувати TypeScript типи, щоб наш IntelliSense працював на повну.