Функциональные компоненты являются основой построения пользовательских интерфейсов в Preact. Они представляют собой чистые функции, принимающие props и возвращающие JSX-элементы. В отличие от классовых компонентов, функциональные компоненты более компактны, легче тестируются и интегрируются с современными возможностями Preact, такими как хуки.
Синтаксис функционального компонента прост:
import { h } from 'preact';
function Button({ label, onClick }) {
return (
<button onCl ick={onClick}>
{label}
</button>
);
}
export default Button;
Основные моменты:
Props позволяют компоненту быть динамичным и повторно используемым. Значения передаются при рендеринге:
<Button label="Сохранить" onCl ick={() => console.log('Сохранено')} />
<Button label="Отмена" onCl ick={() => console.log('Отменено')} />
В функциональном компоненте доступ к props осуществляется напрямую через параметры функции. Можно использовать деструктуризацию для удобства:
function Alert({ message, type }) {
return (
<div className={`alert alert-${type}`}>
{message}
</div>
);
}
Функциональные компоненты могут управлять состоянием с помощью
хуков, таких как 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>
<button onCl ick={() => setCount(count - 1)}>Уменьшить</button>
</div>
);
}
Ключевые аспекты работы с хуками:
useState(initialValue) возвращает массив из текущего
значения состояния и функции для его обновления.Для управления побочными эффектами используется хук useEffect. Он позволяет выполнять операции после рендера компонента, аналогично методам жизненного цикла классовых компонентов:
import { useEffect } from 'preact/hooks';
function Timer() {
const [time, setTime] = useState(0);
useEffect(() => {
const interval = setInterval(() => {
setTime(prev => prev + 1);
}, 1000);
return () => clearInterval(interval);
}, []);
return <p>Прошло секунд: {time}</p>;
}
Особенности:
События в Preact обрабатываются через атрибуты JSX, аналогично стандартным HTML-событиям. Отличия от React минимальны, за исключением некоторых нюансов производительности.
function InputLogger() {
const [text, setText] = useState('');
return (
<input
type="text"
value={text}
onIn put={e => setText(e.target.value)}
/>
);
}
Особенности:
onClick,
onInput, onChange).onInput вместо
onChange для мгновенного реагирования на ввод.Функциональные компоненты легко комбинировать. Один компонент может использовать другой для построения более сложных интерфейсов:
function Card({ title, content }) {
return (
<div className="card">
<h2>{title}</h2>
<p>{content}</p>
</div>
);
}
function App() {
return (
<div>
<Card title="Заголовок 1" content="Текст карточки 1" />
<Card title="Заголовок 2" content="Текст карточки 2" />
</div>
);
}
Композиция компонентов позволяет разделять интерфейс на логические части, повышая повторное использование кода.
Для оптимизации рендеринга используется memo,
позволяющий предотвращать ненужные обновления компонента при неизменных
props:
import { memo } from 'preact/compat';
const ExpensiveComponent = memo(function({ data }) {
console.log('Рендер компонента');
return <div>{data}</div>;
});
Особенности:
memo сравнивает текущие и предыдущие props.Функциональные компоненты в Preact обеспечивают легкость, гибкость и высокую производительность. Сочетание JSX, хуков и композиции позволяет строить масштабируемые и поддерживаемые интерфейсы, минимизируя сложность кода.