Skip to main content

client-side state VS server-side state

Визначення

ТермінЩо це таке
Client-side stateДані, які живуть лише в браузері, керуються самим React і існують незалежно від сервера.
Server-side stateДані, які зберігаються на сервері (у базі, API тощо) і мають бути завантажені, оновлені або синхронізовані з клієнтом.

1. Client-side state (клієнтський стан)

Це все, що існує лише на фронтенді, і React сам це контролює через useState, useReducer, useContext тощо.

Приклади client state:

  • Чи відкрита модалка (isModalOpen)
  • Поточний фільтр або сортування
  • Обрана вкладка
  • Текст, введений користувачем, але не відправлений
  • Валідація форми
  • Стан теми (dark / light)
  • Дані в localStorage

Ці дані не потрібно синхронізувати з сервером. Вони живуть у пам'яті браузера і зникають при перезавантаженні сторінки.


2. Server-side state (серверний стан)

Це дані, які належать серверу, а клієнт лише завантажує їх, відображає і іноді змінює.

Приклади:

  • Список користувачів з API
  • Товари в магазині
  • Дані профілю користувача
  • Коментарі під постом
  • Баланс рахунку
  • Будь-яка інформація, що зберігається в БД

Такі дані:

  • отримуються асинхронно (fetch, axios, graphql, react-query, trpc),
  • можуть змінитися на сервері без відома клієнта,
  • вимагають оновлення (рефетчингу) за певних подій.

3. Ключові відмінності

ХарактеристикаClient-side stateServer-side state
Де зберігаєтьсяУ пам'яті браузераНа сервері / API
Хто "власник" данихКлієнтСервер
Як оновлюєтьсяОдразу через setStateЧерез HTTP-запит (fetch, axios тощо)
Чи може змінитися "само по собі"?НіТак (інші користувачі, процеси)
Чи потрібно синхронізуватиНіТак (через рефетч або веб-сокети)
Прикладимодалки, фільтри, поточна вкладкасписок товарів, пости, профіль користувача
Втратиться при перезавантаженніТакНі (дані на сервері зберігаються)

Приклад для наочності

Client-side state

javascript
const [isModalOpen, setIsModalOpen] = useState(false);

Модалка відкривається і закривається - все живе в React. Серверу все одно.


Server-side state

javascript
const [users, setUsers] = useState([]); useEffect(() => { fetch("/api/users") .then(res => res.json()) .then(setUsers); }, []);

Тут дані приходять із зовнішнього джерела (API). Якщо хтось додасть нового користувача, сервер оновиться, а клієнт - ще не знає, поки не зробить повторний запит (рефетч).


4. Чому це важливо розділяти

  1. Різні вимоги до оновлення
  • Client state оновлюється миттєво через setState.
  • Server state вимагає мережевого запиту → асинхронно.
  1. Різні інструменти
  • Client state → useState, useReducer, useContext, Zustand, Redux Toolkit.
  • Server state → React Query, SWR, Apollo, tRPC, RTK Query.
  1. Різне "життя даних"
  • Client state - живе, поки відкритий компонент.
  • Server state - може кешуватися, рефетчитися, інвалідовуватися.
  1. Різна стратегія кешування
  • Client state: немає сенсу кешувати, це локальні UI-дані.
  • Server state: обов'язково кешувати, щоб не навантажувати API при кожному рендері.

5. Сучасний підхід: "розділяй і володарюй"

Тримай локальний стан якомога ближче до UI (useState, useReducer, useContext)

А серверний стан - виноси у спеціалізовані інструменти, які вміють:

  • кешувати запити,
  • рефетчити при змінах,
  • синхронізувати дані при фокусі вкладки,
  • оптимістично оновлювати інтерфейс.

Приклади:

javascript
React Query (TanStack Query) SWR (Next.js) Apollo Client (GraphQL) RTK Query (Redux)

Приклад з React Query

javascript
import { useQuery } from "@tanstack/react-query"; function UsersList() { const { data, isLoading, error } = useQuery({ queryKey: ["users"], queryFn: () => fetch("/api/users").then(res => res.json()), }); if (isLoading) return <p>Завантаження...</p>; if (error) return <p>Помилка!</p>; return ( <ul> {data.map(u => <li key={u.id}>{u.name}</li>)} </ul> ); }

Тут data - це server-side state, але React Query керує його кешем, рефетчем і синхронізацією.


Підсумок

Client-side stateServer-side state
Де живеУ React / браузеріНа сервері
Як оновлюєтьсяОдразу (setState)Через запит
Може застаріти без відома клієнтаНіТак
ІнструментиuseState, useReducer, useContext, ZustandReact Query, SWR, RTK Query, Apollo
Прикладимодалка, фільтр, темапости, товари, профіль
Чи потрібно рефетчитиНіТак
Рендер при оновленніОдразуПісля відповіді сервера

Проста аналогія

Client state - це як "чернетка" на твоєму столі: ти пишеш нотатки, швидко редагуєш, нічого не синхронізується.

Server state - це як документ у хмарі (Google Docs): він зберігається на сервері, може змінитися в інших користувачів, і тобі потрібен час, щоб отримати актуальну версію.

Коротка відповідь

Для співбесіди
Premium

Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.