Що таке контрольовані та некеровані компоненти React?


101

Що таке керовані та неконтрольовані компоненти в ReactJS? Чим вони відрізняються один від одного?


21
Номінація на повторне відкриття. Це насправді досить точне питання. Не впевнений, як його можна вважати занадто широким.
— Charlie Flowers

Відповіді:


127

Це стосується компонентів DOM, що містять статус (елементи форми), і документи React пояснюють різницю:

  • Контрольований компонент є той , який бере свій поточне значення через propsта повідомляє зміни через зворотні виклики , як onChange. Батьківський компонент "контролює" його, обробляючи зворотний виклик та керуючи своїм власним станом, і передаючи нові значення як властивості контрольованому компоненту. Ви також можете назвати це "німим компонентом".
  • Неконтрольований Компонент є той , який зберігає свій власний стан всередині, і ви запитуєте DOM з допомогою , refщоб знайти його поточне значення , коли вам це потрібно. Це трохи більше як традиційний HTML.

Більшість компонентів рідної форми React підтримують як контрольоване, так і неконтрольоване використання:

// Controlled:
<input type="text" value={value} onChange={handleChange} />

// Uncontrolled:
<input type="text" defaultValue="foo" ref={inputRef} />
// Use `inputRef.current.value` to read the current value of <input>

У більшості (або у всіх) випадках слід використовувати контрольовані компоненти .


1
Хіба вартість не сприймається, stateа не props?
— Іванка Тодорова

9
@IvankaTodorova Для контрольованого компонента значення передається через props. Неконтрольований компонент буде використовувати stateдля внутрішнього контролю самого значення. Це ключова різниця.
— Аарон Білл

1
Різниця між ними полягає в тому, що компоненти, для яких їх значення встановлюється / передається і мають зворотний виклик, називаються controlled components( <input type="text" value="value" onChange={handleChangeCallbackFn} />) порівняно з традиційним HTML, де вхідний елемент обробляє їхнє власне значення і може бути прочитаний через refsвикликаний uncontrolled components( <value type="text" />). Контрольовані компоненти управляють своїм власним станом за допомогою setStateбатьківського компонента або отримують його як пропс.
— Ліор

Як би ви назвали компонент, який отримує його defaultValueчерез реквізит, але який повідомляє контролер onBlur?
— Пол Разван Берг,

@PaulRazvanBerg Це звучить як анти-шаблон, державою слід керувати в одному місці . Зазвичай ви піднімаєте стан до найближчого спільного предка.
— Аарон Білл

1
  • Контрольовані компоненти повідомляють інші компоненти про зміни за допомогою зворотних викликів. Наприклад: <Button onClick={() => console.log("clicked")}>Click</Button>.
  • Неконтрольовані компоненти не повідомляють інші компоненти про їх зміни, і ви можете отримати доступ до них лише за допомогою ref-s. Посилання може бути корисним, якщо вам потрібен доступ до реального дому елемента HTML
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.