Haunted — это библиотека для создания веб-компонентов с использованием функционального подхода, аналогичного React Hooks. В контексте Haunted понятие неконтролируемого поля связано с управлением состоянием формы и взаимодействием с DOM напрямую, без привязки значения к состоянию компонента.
Неконтролируемое поле — это элемент формы, значение которого хранится не в состоянии компонента, а в самом DOM. Haunted не отслеживает изменения такого поля через свои хуки, вместо этого используется прямой доступ к свойствам элемента или событиям ввода.
Пример неконтролируемого поля:
import { html, component } from 'haunted';
function Form() {
let inputRef;
const handleSubmit = (event) => {
event.preventDefault();
console.log(inputRef.value); // Значение берётся напрямую из DOM
};
return html`
<form @submit=${handleSubmit}>
<input type="text" .ref=${(el) => inputRef = el} />
<button type="submit">Отправить</button>
</form>
`;
}
customElements.define('my-form', component(Form));
Ключевые моменты:
inputRef хранит ссылку на DOM-элемент
<input>..value считывается при необходимости, а не
синхронизируется с состоянием Haunted.useState или
useReducer для хранения значения поля.Контролируемое поле полностью управляется состоянием компонента через хуки Haunted:
import { html, component } from 'haunted';
import { useState } from 'haunted';
function ControlledForm() {
const [value, setValue] = useState('');
const handleSubmit = (event) => {
event.preventDefault();
console.log(value); // Значение берётся из состояния
};
return html`
<form @submit=${handleSubmit}>
<input type="text" .value=${value} @input=${(e) => setValue(e.target.value)} />
<button type="submit">Отправить</button>
</form>
`;
}
customElements.define('controlled-form', component(ControlledForm));
Различия:
input.ref для неконтролируемых полейHaunted поддерживает привязку DOM-элементов через функцию
ref:
<input .ref=${el => inputRef = el} />
Эта конструкция гарантирует, что переменная inputRef
содержит актуальный элемент DOM после рендера. В отличие от React,
Haunted не использует виртуальный DOM, поэтому доступ к реальному
элементу прямой и эффективный.
Неконтролируемые поля позволяют выполнять следующие операции:
.value.inputRef.value = 'новое значение'.inputRef.focus().inputRef.select().Пример автоматической установки значения при монтировании:
import { useEffect } from 'haunted';
function AutofillForm() {
let inputRef;
useEffect(() => {
inputRef.value = 'Предустановленное значение';
inputRef.focus();
}, []);
return html`<input .ref=${el => inputRef = el} />`;
}
customElements.define('autofill-form', component(AutofillForm));
useEffect для установки начальных значений или выполнения
действий после рендера.ref для каждого поля, если можно собрать их через
FormData при отправке формы.submit и
change позволяют работать с данными без отслеживания
каждого ввода.function ComplexForm() {
let nameRef, emailRef, commentRef;
const handleSubmit = (event) => {
event.preventDefault();
const data = {
name: nameRef.value,
email: emailRef.value,
comment: commentRef.value,
};
console.log(data);
};
return html`
<form @submit=${handleSubmit}>
<input type="text" placeholder="Имя" .ref=${el => nameRef = el} />
<input type="email" placeholder="Email" .ref=${el => emailRef = el} />
<textarea placeholder="Комментарий" .ref=${el => commentRef = el}></textarea>
<button type="submit">Отправить</button>
</form>
`;
}
customElements.define('complex-form', component(ComplexForm));
В этом примере форма не хранит значения в состоянии, а извлекает их только при отправке, что делает компонент легковесным и быстрым.