Haunted — это библиотека для создания веб-компонентов с использованием реактивного подхода, основанного на хуках, похожих на React. Управление состоянием форм и их сброс — важная часть работы с пользовательским вводом, особенно когда необходимо синхронизировать UI и данные внутри компонента.
Форма в Haunted чаще всего строится с использованием
реактивного состояния через хук useState.
Каждое поле формы может быть представлено отдельным состоянием:
import { html, component, useState } from 'haunted';
function MyForm() {
const [name, setName] = useState('');
const [email, setEmail] = useState('');
return html`
<form>
<label>
Имя:
<input .value=${name} @input=${e => setName(e.target.value)} />
</label>
<label>
Email:
<input .value=${email} @input=${e => setEmail(e.target.value)} />
</label>
<button type="button" @click=${() => resetForm()}>Сброс</button>
</form>
`;
function resetForm() {
setName('');
setEmail('');
}
}
customElements.define('my-form', component(MyForm));
Ключевые моменты:
.value с точкой позволяет
связывать значение поля напрямую со состоянием.@input обеспечивает реактивное
обновление состояния при изменении ввода.resetForm вручную сбрасывает каждое состояние к
начальному значению.Если форма содержит большое количество полей, ручной сброс каждого состояния становится громоздким. Эффективнее хранить все данные формы в одном объекте:
function MyForm() {
const [formData, setFormData] = useState({ name: '', email: '', age: '' });
const handleChange = (field) => (e) => {
setFormData({ ...formData, [field]: e.target.value });
};
const resetForm = () => {
setFormData({ name: '', email: '', age: '' });
};
return html`
<form>
<label>
Имя:
<input .value=${formData.name} @input=${handleChange('name')} />
</label>
<label>
Email:
<input .value=${formData.email} @input=${handleChange('email')} />
</label>
<label>
Возраст:
<input type="number" .value=${formData.age} @input=${handleChange('age')} />
</label>
<button type="button" @click=${resetForm}>Сброс</button>
</form>
`;
}
Преимущества такого подхода:
Часто необходимо очищать форму после успешной отправки данных:
function handleSubmit(e) {
e.preventDefault();
console.log('Отправка данных:', formData);
resetForm();
}
В Haunted форма не имеет встроенного механизма для автоматического сброса состояния, поэтому необходимо:
e.preventDefault().resetForm для очистки состояния.useEffect для сброса при изменении пропсовИногда форма должна сбрасываться при изменении внешних
данных. В Haunted это реализуется через хук
useEffect:
import { useEffect } from 'haunted';
function MyForm({ initialData }) {
const [formData, setFormData] = useState(initialData);
useEffect(() => {
setFormData(initialData);
}, [initialData]);
return html`...`;
}
Особенности:
initialData.Для форм с вложенными объектами или массивами можно использовать глубокое клонирование состояния при сбросе:
const resetForm = () => {
setFormData(JSON.parse(JSON.stringify(initialData)));
};
Для больших форм рекомендуется объединять все поля в один объект состояния.
Всегда использовать реактивные привязки
.value и события @input.
Сброс можно реализовать:
useEffect при изменении внешних данных.Для сложных вложенных форм применять глубокое клонирование или библиотеку для иммутабельности, чтобы избежать неожиданных багов.
Сброс форм в Haunted полностью основан на реактивной работе с состоянием и хуках. Правильная структура состояния и управление им позволяет создавать масштабируемые, легко поддерживаемые формы, готовые к динамическим изменениям данных и сложной логике взаимодействия с пользователем.