ENIGMA AI
ENIGMA AI
React Средний

Что такое controlled и uncontrolled компоненты в React?

Controlled vs Uncontrolled Components

Controlled Components

React контролирует значение через state:

function ControlledInput() {
    const [value, setValue] = useState('');

    return (
        <input
            value={value}
            onChange={(e) => setValue(e.target.value)}
        />
    );
}

Характеристики:

  • Значение хранится в React state
  • Каждое изменение — через onChange
  • React — "source of truth"

Uncontrolled Components

DOM сам хранит значение:

function UncontrolledInput() {
    const inputRef = useRef();

    const handleSubmit = () => {
        console.log(inputRef.current.value);
    };

    return (
        <>
            <input ref={inputRef} defaultValue="initial" />
            <button onClick={handleSubmit}>Submit</button>
        </>
    );
}

Характеристики:

  • Значение в DOM
  • Доступ через ref
  • defaultValue вместо value

Сравнение:

Аспект Controlled Uncontrolled
Данные React state DOM
Валидация На каждое изменение При submit
Условный рендер Легко Сложнее
Производительность Больше ре-рендеров Меньше
Интеграция Легко с библиотеками Проще для простых форм

Когда использовать:

Controlled:

  • Валидация в реальном времени
  • Условное отключение submit
  • Форматирование ввода
  • Несколько входов зависят друг от друга

Uncontrolled:

  • Простые формы
  • Интеграция с non-React кодом
  • Файловый input (всегда uncontrolled)

Файловый input:

function FileInput() {
    const fileRef = useRef();

    return (
        <input
            type="file"
            ref={fileRef}
            // value нельзя установить программно
        />
    );
}

React Hook Form (гибридный подход):

import { useForm } from 'react-hook-form';

function Form() {
    const { register, handleSubmit } = useForm();

    return (
        <form onSubmit={handleSubmit(data => console.log(data))}>
            <input {...register('name')} />
            <button type="submit">Submit</button>
        </form>
    );
}

Похожие вопросы

Готовитесь к собеседованию?

ENIGMA AI — невидимый ИИ-помощник для технических интервью

Попробовать бесплатно
Все вопросы