В Preact, как и в React, компоненты формы можно разделить на контролируемые и неконтролируемые. Это деление определяется тем, как управляются значения элементов формы: с помощью состояния компонента или напрямую через DOM.
ref) или события.Выбор между этими подходами зависит от требований к синхронизации данных, валидации и реактивности интерфейса.
Контролируемые компоненты позволяют полностью управлять формой через состояние. Это обеспечивает предсказуемое поведение, упрощает валидацию и интеграцию с другими данными приложения.
import { h } from 'preact';
import { useState } from 'preact/hooks';
function ControlledInput() {
const [value, setValue] = useState('');
const handleChange = (event) => {
setValue(event.target.value);
};
return (
<input type="text" value={value} onIn put={handleChange} />
);
}
Разбор ключевых моментов:
value хранит текущее значение поля.onInput обновляет состояние при каждом
вводе.value синхронизирован с состоянием, что делает
компонент контролируемым.Для элементов типа checkbox и radio управление также осуществляется через состояние:
function ControlledCheckbox() {
const [checked, setChecked] = useState(false);
const toggle = () => setChecked(!checked);
return (
<input type="checkbox" checked={checked} onCha nge={toggle} />
);
}
Особенность: для checkbox и radio используется атрибут
checked вместо value.
Неконтролируемые компоненты хранят свое состояние внутри DOM. Доступ
к значению осуществляется через ref, что упрощает работу с
формами без постоянного синхронизирования с состоянием.
import { h } from 'preact';
import { useRef } from 'preact/hooks';
function UncontrolledInput() {
const inputRef = useRef(null);
const handleSubmit = () => {
console.log(inputRef.current.value);
};
return (
<div>
<input type="text" ref={inputRef} />
<button onCl ick={handleSubmit}>Отправить</button>
</div>
);
}
Особенности:
useRef создаёт ссылку на DOM-элемент.| Характеристика | Контролируемый компонент | Неконтролируемый компонент |
|---|---|---|
| Хранение данных | В состоянии компонента | В DOM |
| Валидация | Легко, на каждом шаге | Только при необходимости |
| Сложность реализации | Выше | Ниже |
| Поддержка сложной логики | Отличная | Ограниченная |
| Реактивность интерфейса | Полная | Частичная |
Контролируемые компоненты предпочтительны при необходимости динамического взаимодействия с формой, реактивной валидации и сложной логики. Неконтролируемые удобны для простых форм, где отслеживание состояния не критично.
Preact совместим с большинством API React для форм, но есть нюансы:
onInput предпочтительнее onChange для
текстовых полей, так как Preact правильно обрабатывает ввод через это
событие.ref может быть более
производительным, так как избегается постоянное обновление
состояния.Использовать контролируемые компоненты, если требуется:
Использовать неконтролируемые компоненты, если:
Комбинированный подход допустим: ключевые поля формы можно сделать контролируемыми, а второстепенные — неконтролируемыми для оптимизации производительности.
Контролируемые и неконтролируемые компоненты являются фундаментальной концепцией Preact, напрямую влияющей на архитектуру формы, производительность и управляемость интерфейса. Понимание их различий позволяет строить гибкие, эффективные и предсказуемые пользовательские интерфейсы.