Перш ніж пірнати в код Redux, давайте зупинимося і відповімо на головне питання: "Яку проблему ми взагалі намагаємося вирішити?".
Багато розробників додають Redux у проєкт просто тому, що "так прийнято" або "це є в вимогах вакансії". Це призводить до надмірно складної архітектури там, де вона не потрібна.
У цьому розділі ми розберемося, що таке стан, яким він буває, і коли useState перестає справлятися.
У контексті React, State (Стан) — це будь-які дані, які змінюються у часі та впливають на те, що користувач бачить на екрані.
Це не тільки дані з бази даних. Стан — це все:
Щоб ефективно керувати даними, важливо розрізняти їх типи. Не все має лежати в Redux!
| Тип стану | Опис | Приклад | Де зберігати? |
|---|---|---|---|
| Local State | Дані, що стосуються одного компонента або його найближчих дітей. | Значення input, стан відкриття dropdown. | useState, useReducer |
| Global State | Дані, потрібні багатьом компонентам у різних частинах дерева. | Профіль користувача, тема (світла/темна), мова інтерфейсу. | Context API, Redux, Zustand |
| Server State | Кешовані дані, отримані з API. | Список товарів, деталі замовлення. | React Query, SWR, RTK Query |
| URL State | Дані, що зберігаються в адресному рядку. | ID активного товару (/product/123), параметри фільтрації (?sort=price). | React Router |
Уявіть, що у вас є типовий React-додаток. У вас є кореневий компонент App, в ньому є Layout, в ньому Header, в Header є UserMenu, а в UserMenu — Avatar.
Вам потрібно передати об'єкт user з App в Avatar.
Без глобального стейт-менеджера це виглядає так:
Це явище називається Prop Drilling ("свердління пропсів").
Layout, Header) забруднені пропсами, які їм не потрібні.user на currentUser, вам доведеться правити 4 файли замість одного.Header не може існувати без user, хоча логічно він йому не потрібен.user може викликати ре-рендер усіх проміжних компонентів (хоча React намагається це оптимізувати, це все одно потенційна проблема).Глобальний менеджер стану (наприклад, Redux) працює як "хмара" для вашого додатку. Ви кладете дані в цю хмару, і будь-який компонент може "підключитися" до неї і отримати те, що йому потрібно, напряму.
Крім вирішення проблеми Prop Drilling, Redux дає нам ще дещо важливе:
user.name = 'Max'). Ви повинні "попросити" систему зробити зміни через спеціальну подію (Action). Це гарантує, що зміни відбуваються контрольовано.Тепер, коли ми розуміємо навіщо нам це потрібно, давайте розберемося з теоретичним фундаментом, на якому побудований Redux — архітектурою Flux та концепціями функціонального програмування.
Redux: Еволюція управління станом
Повний посібник з Redux: від фундаментальних принципів та "класичного" підходу до сучасного Redux Toolkit та RTK Query.
Філософія Redux та Три Принципи
Redux часто вважають складною бібліотекою, але насправді він базується на кількох дуже простих ідеях. Складність виникає не з самої бібліотеки, а з нових термінів та обмежень, які вона накладає.