Что такое компоненты, контролируемые React, и неконтролируемые компоненты?


103

Что такое контролируемые компоненты и неконтролируемые компоненты в ReactJS? Чем они отличаются друг от друга?


22
Назначение для повторного открытия. На самом деле это довольно точный вопрос. Не уверен, что это можно считать слишком широким.
Чарли Флауэрс

Ответы:


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-элемента.

1

Управляемый компонент - это компонент, который получает измененное значение от функции обратного вызова, а неуправляемый компонент - это компонент, который имеет значение из DOM. Например, при изменении входного значения мы можем использовать функцию onChange в контролируемом компоненте, а также мы можем получить значение, используя DOM, например ref.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.