Skip to main content

Що таке "Controlled Component"?

Визначення

Controlled Component - це компонент, у якого значення повністю керується станом React (state).

Іншими словами: UI = функція від стану.


Ідея

У звичайному HTML <input> сам зберігає своє значення (внутрішньо, в DOM). А в React, якщо ти робиш контрольований компонент, значення цього поля зберігається в стані компонента, а не в DOM.


Приклад контрольованого компонента

javascript
function NameForm() { const [name, setName] = useState(''); return ( <div> <input type="text" value={name} // <- значення береться зі state onChange={(e) => setName(e.target.value)} // <- оновлюємо state при вводі /> <p>Привіт, {name || 'гість'}!</p> </div> ); }

Тут input контролюється станом name:

  • React зберігає значення поля у своєму state;
  • при кожній зміні onChange оновлює стан;
  • UI автоматично перемальовується з новим значенням.

Приклад неконтрольованого компонента (для порівняння)

javascript
function NameForm() { const inputRef = useRef(); function handleSubmit() { alert(`Привіт, ${inputRef.current.value}`); } return ( <div> <input type="text" ref={inputRef} /> {/* значення зберігається в DOM */} <button onClick={handleSubmit}>Надіслати</button> </div> ); }

Тут <input> неконтрольований - React не знає його значення, воно живе всередині DOM. Ми можемо прочитати його тільки через ref.


Відмінності

КритерійControlledUncontrolled
Де зберігається значенняУ React stateУсередині DOM
Як змінюється значенняЧерез onChange і setStateКористувач вводить напряму
Коли оновлюється UIПри зміні stateReact не контролює
Двостороннє зв'язуванняТакНі
ТестованістьВисокаНизька
Використання у формахРекомендуєтьсяТільки для простих випадків

Чому контрольовані компоненти важливі

  1. React повністю керує станом -> UI завжди синхронізований.
  2. Можна валідувати дані при кожному введенні.
  3. Можна скидати, змінювати, автозаповнювати значення програмно.
  4. Єдине джерело істини - значення поля = стан React.

Приклад використання у формі

javascript
function LoginForm() { const [form, setForm] = useState({ email: '', password: '' }); function handleChange(e) { setForm({ ...form, [e.target.name]: e.target.value }); } function handleSubmit(e) { e.preventDefault(); console.log(form); // використовуємо дані зі state } return ( <form onSubmit={handleSubmit}> <input name="email" value={form.email} onChange={handleChange} /> <input name="password" type="password" value={form.password} onChange={handleChange} /> <button type="submit">Увійти</button> </form> ); }

Тут обидва <input> повністю контролюються станом form - React знає кожну зміну в реальному часі.


Підсумок

Що цеКомпонент, значення якого зберігається в React state
Де зберігається станУ React, а не в DOM
Як оновлюєтьсяЧерез onChange -> setState
Приклад<input value={name} onChange={...} />
ПеревагиПередбачуваність, валідація, "єдине джерело істини"
Аналогія"React тримає кермо, а не DOM"

Головна думка: Контрольований компонент - це той, у якого React керує значенням.

UI просто відображає поточний стан, а не зберігає його сам.

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

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

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