Формы являются ключевым элементом интерактивных приложений. В Inferno
формы обрабатываются аналогично React, с использованием контролируемых и
неконтролируемых компонентов. Контролируемая форма
предполагает, что состояние каждого поля управляется через состояние
компонента, а неконтролируемая полагается на прямой
доступ к DOM через ref.
import { createComponent } from 'inferno';
class ControlledForm extends createComponent {
constructor(props) {
super(props);
this.state = { username: '' };
this.handleChange = this.handleChange.bind(this);
this.handleSubmit = this.handleSubmit.bind(this);
}
handleChange(e) {
this.setState({ username: e.target.value });
}
handleSubmit(e) {
e.preventDefault();
console.log('Submitted username:', this.state.username);
}
render() {
return (
<form onSub mit={this.handleSubmit}>
<input
type="text"
value={this.state.username}
onIn put={this.handleChange}
/>
<button type="submit">Отправить</button>
</form>
);
}
}
Ключевой момент: в Inferno вместо
onChange часто используется onInput, так как
библиотека оптимизирована под высокую производительность и нативные
события ввода.
Для сложных форм с множеством полей рекомендуется использовать единое состояние объекта:
this.state = {
formData: {
email: '',
password: '',
}
};
handleInputChange(e) {
const { name, value } = e.target;
this.setState({
formData: {
...this.state.formData,
[name]: value
}
});
}
Выделение ключевого момента: использование деструктуризации и spread-оператора позволяет обновлять только изменяемое поле без затрагивания остальных данных формы.
Валидация данных может выполняться как на уровне компонента, так и с
использованием сторонних библиотек. В Inferno чаще применяют
клиентскую валидацию, выполняемую в
handleSubmit или при изменении значения поля.
validateEmail(email) {
const regex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
return regex.test(email);
}
handleSubmit(e) {
e.preventDefault();
if (!this.validateEmail(this.state.formData.email)) {
console.error('Неверный формат email');
return;
}
console.log('Форма валидна:', this.state.formData);
}
Важно: валидация на уровне компонента позволяет мгновенно уведомлять пользователя о неверных данных, что повышает UX.
Неконтролируемые поля можно использовать, когда нет необходимости хранить состояние каждого изменения:
class UncontrolledForm extends createComponent {
constructor(props) {
super(props);
this.inputRef = null;
this.setInputRef = element => { this.inputRef = element; };
this.handleSubmit = this.handleSubmit.bind(this);
}
handleSubmit(e) {
e.preventDefault();
console.log('Input value:', this.inputRef.value);
}
render() {
return (
<form onSub mit={this.handleSubmit}>
<input type="text" ref={this.setInputRef} />
<button type="submit">Отправить</button>
</form>
);
}
}
Особенность Inferno: работа с ref
аналогична React, но стоит учитывать, что обновления DOM происходят
быстрее, поэтому прямой доступ к элементу безопасен даже при частых
ререндерингах.
В современных приложениях часто требуется проверять данные на сервере до отправки. Для этого используется асинхронная обработка:
async handleSubmit(e) {
e.preventDefault();
const response = await fetch('/validate-email', {
method: 'POST',
body: JSON.stringify({ email: this.state.formData.email }),
headers: { 'Content-Type': 'application/json' }
});
const result = await response.json();
if (!result.valid) {
console.error('Email уже занят');
} else {
console.log('Форма готова к отправке');
}
}
Выделение ключевого момента: использование async/await упрощает обработку асинхронной валидации, делая код более читаемым и предсказуемым.
Для крупных проектов рекомендуется разделять формы на мелкие компоненты, каждый из которых отвечает за свою часть данных и валидацию. Это облегчает поддержку и тестирование.
const EmailField = ({ value, onChange, error }) => (
<div>
<input type="email" value={value} onIn put={onChange} />
{error && <span>{error}</span>}
</div>
);
Выделение ключевого момента: компонентный подход позволяет повторно использовать поля, применять единые правила валидации и изолировать ошибки.
Структурированное управление состоянием, правильная валидация и оптимизация через неконтролируемые поля делают формы в Inferno мощным инструментом для создания высокопроизводительных веб-приложений.