Preact — это легковесная библиотека для построения пользовательских интерфейсов, которая совместима с концепциями React, но оптимизирована по размеру и производительности. При разработке приложений на Preact можно использовать как функциональный, так и объектно-ориентированный подход, что позволяет выбирать стиль программирования в зависимости от требований проекта и личных предпочтений.
Функциональный стиль в Preact ориентирован на чистые функции, минимизацию побочных эффектов и использование хуков для управления состоянием. Объектно-ориентированный стиль подразумевает создание классовых компонентов, использование методов класса для работы с жизненным циклом и состояния компонента.
Функциональные компоненты — это функции, которые принимают props и возвращают виртуальный DOM. Основное преимущество функционального подхода — компактность и простота тестирования.
Пример функционального компонента:
import { h } from 'preact';
import { useState } from 'preact/hooks';
function Counter() {
const [count, setCount] = useState(0);
const increment = () => setCount(count + 1);
return (
<div>
<p>Счётчик: {count}</p>
<button onCl ick={increment}>Увеличить</button>
</div>
);
}
export default Counter;
Ключевые моменты функционального подхода:
useState и других хуков
(useEffect, useMemo, useCallback)
для управления состоянием и эффектами.useState — хранение локального состояния
компонента.useEffect — выполнение побочных эффектов (например,
запросов к API, подписок).useMemo — кэширование вычислений для оптимизации
рендеринга.useCallback — мемоизация функций, передаваемых в
дочерние компоненты.Использование хуков способствует чистоте функций и уменьшает сложность управления состоянием в больших приложениях.
Классовые компоненты позволяют создавать объекты с состоянием и методами, что удобно при работе со сложной логикой.
Пример классового компонента:
import { h, Component } from 'preact';
class Counter extends Component {
constructor(props) {
super(props);
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>
);
}
}
export default Counter;
Основные характеристики классового подхода:
this.state, изменения выполняются
через this.setState().componentDidMount,
componentDidUpdate, componentWillUnmount.| Параметр | Функциональный компонент | Классовый компонент |
|---|---|---|
| Состояние | useState |
this.state |
| Жизненный цикл | useEffect |
Методы жизненного цикла |
| Сложность | Ниже | Выше |
| Тестирование | Легче | Сложнее |
| Переиспользование логики | Хуки | Наследование/методы |
| Компактность кода | Высокая | Средняя |
Функциональный подход часто используется в современных проектах благодаря простоте и оптимизации рендеринга, в то время как объектно-ориентированный стиль может быть полезен для сложных корпоративных приложений с богатой иерархией компонентов и множеством методов жизненного цикла.
В реальных проектах на Preact допустимо комбинировать оба подхода. Например, основные UI-компоненты создаются функционально, а сложные обособленные модули или внешние виджеты — через классы. Такой подход позволяет сохранить гибкость архитектуры и облегчает масштабирование приложения.
Для функциональных компонентов характерно использование хуков и
внешних библиотек вроде zustand или
redux-toolkit, тогда как для классовых компонентов может
применяться локальное состояние с методами обновления или
Context API для передачи данных через дерево
компонентов.
Функциональный подход усиливает реактивность и предсказуемость, объектно-ориентированный — структурированность и формализм. Выбор между ними зависит от размера проекта, опыта команды и требований к поддерживаемости кода.
Функциональный и объектно-ориентированный подходы в Preact взаимодополняют друг друга, обеспечивая баланс между легковесностью и структурированностью, что позволяет создавать масштабируемые, поддерживаемые и эффективные интерфейсы.