Состояние (state) в Preact играет ключевую роль в построении динамических интерфейсов. Оно позволяет компонентам хранить данные, изменяемые во времени, и автоматически перерисовывать интерфейс при изменении этих данных. Preact использует облегчённую модель реактивности, близкую к React, но с минимальным весом и высокой производительностью.
useStateВ функциональных компонентах состояние создаётся с помощью хука
useState. Синтаксис:
import { h } from 'preact';
import { useState } from 'preact/hooks';
function Counter() {
const [count, setCount] = useState(0);
return (
<div>
<p>Текущее значение: {count}</p>
<button onCl ick={() => setCount(count + 1)}>Увеличить</button>
</div>
);
}
Разбор ключевых моментов:
useState(0) — инициализирует состояние значением
0.count — текущий вариант состояния.setCount — функция для обновления состояния. Любое её
использование вызывает повторный рендер компонента с новым
значением.useState можно использовать несколько раз в одном
компоненте для хранения разных данных:
const [name, setName] = useState('');
const [age, setAge] = useState(25);
Если начальное состояние вычисляется дорогостоящей функцией, Preact
позволяет передавать функцию в useState. Эта функция будет
выполнена один раз при монтировании компонента:
const [data, setData] = useState(() => fetchInitialData());
Это предотвращает лишние вычисления при каждом рендере.
При изменении состояния, зависящего от предыдущего значения, рекомендуется использовать коллбек-форму:
setCount(prevCount => prevCount + 1);
Такой подход гарантирует корректное обновление при множественных
вызовах setCount, особенно в асинхронных сценариях.
Для сложных данных можно использовать один объект состояния, но тогда важно правильно обновлять отдельные поля:
const [form, setForm] = useState({ username: '', password: '' });
function updateUsername(newUsername) {
setForm(prevForm => ({ ...prevForm, username: newUsername }));
}
Использование спред-оператора ...prevForm сохраняет
неизменные поля объекта.
// Некорректно
form.username = 'newName';
setForm(form); // Компонент не перерисуется
// Корректно
setForm({ ...form, username: 'newName' });
В Preact также поддерживаются классовые компоненты:
import { h, Component } from 'preact';
class Counter extends Component {
constructor() {
super();
this.state = { count: 0 };
}
increment = () => {
this.setState({ count: this.state.count + 1 });
};
render() {
return (
<div>
<p>Текущее значение: {this.state.count}</p>
<button onCl ick={this.increment}>Увеличить</button>
</div>
);
}
}
Особенности:
this.state.this.setState().Иногда требуется реагировать на изменение состояния через побочные
эффекты. Для этого используется useEffect:
import { useEffect } from 'preact/hooks';
useEffect(() => {
console.log('Счётчик обновлён:', count);
}, [count]);
[count] гарантирует, что эффект будет
вызван только при изменении count.[] вызывает эффект только при
монтировании компонента.useState может
повысить производительность, так как изменение одного состояния не
триггерит ререндер других.Система состояния в Preact обеспечивает компактный и гибкий
инструмент для управления данными компонентов, обеспечивая высокую
производительность и предсказуемое поведение интерфейса. Правильное
использование хуков useState, коллбеков для обновления и
методов классовых компонентов позволяет строить динамичные и отзывчивые
приложения с минимальной сложностью.