Коротка відповідь
juniorДані, що змінюються локально і не потрібні зовнішньому компоненту, зберігаю в state. Дані, що потрібні батькові або іншим компонентам, передаю через пропси. Наприклад, у <Counter> state тримає count; parent передає onIncrement як пропс.
Повне пояснення
Що це і навіщо
У React state використовується для внутрішньої логіки компонента, а пропси – для передачі даних та колбеків між компонентами. Це дозволяє ізолювати локальну поведінку і забезпечує односторонній потік даних.
Ключові принципи
- State: локальний, змінюється через setState/Hook; компонент сам керує ним.
- Props: зовнішній, односторонній; компонент не змінює їх безпосередньо.
Як це працює
React рендерить компонент, передає пропси, а state зберігається в інтерналі. При зміні state викликається повторний рендер.
Практика і реалізація
// Counter.tsx – локальний state
import { useState } from 'react';
export const Counter = ({ onIncrement }: { onIncrement: () => void }) => {
const [count, setCount] = useState(0);
return (
<div>
<span>{count}</span>
<button onClick={() => { setCount(c => c + 1); onIncrement(); }}>+</button>
</div>
);
};
// Parent.tsx – передає пропс
import { Counter } from './Counter';
export const Parent = () => {
const handleInc = () => console.log('incremented');
return <Counter onIncrement={handleInc} />;
};
Тестування
- Unit: перевірити, що
setCountзмінює state. - Integration: перевірити, що
onIncrementвикликається при кліку.
Оптимізація
Використовуйте React.memo або useCallback, щоб уникнути зайвих рендерів, коли пропси не змінюються.
Часті помилки
- Модифікація пропсів – не дозволено.
- Зберігання великих об’єктів у state – краще передавати через пропси.
- Невірне використання ключів – може призвести до некоректного рендеру.
- Занадто глибока вкладеність пропсів – розділіть на декілька компонентів.
- Використання state для даних, що не змінюються – це зайве рендеринг.
- Відсутність типізації у TS – може призвести до помилок.
- Невикористання
useCallbackдля колбеків – викликає нові функції при кожному рендері. - Зберігання колбеків у state – не потрібно, передавайте їх як пропси.
Cheatsheet
- State: локальні, змінюються через setState/Hook.
- Props: зовнішні, односторонній потік.
- useCallback: мемоізація колбеків.
- React.memo: запобігання зайвим рендером.
Follow‑up питання
- Як уникнути «prop drilling»? – використати Context або state‑менеджер.
- Коли слід використовувати Redux замість локального state? – коли дані потрібні багатьом компонентам.
- Як працює
useReducerу порівнянні зuseState? – для складної логіки стану.