Управление состоянием — ключевой аспект разработки интерактивных приложений. В Preact, несмотря на лёгкость и высокую производительность фреймворка, сложность управления состоянием возрастает по мере увеличения масштаба проекта. Рассмотрим основные проблемы и подходы к их решению.
Каждый компонент Preact может хранить своё локальное состояние с
помощью хука 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>
);
}
Проблемы локального состояния:
lifting state up)
или применения глобальных решений.Lifting state up позволяет централизовать состояние,
чтобы несколько компонентов могли его использовать:
function App() {
const [count, setCount] = useState(0);
return (
<div>
<CounterDisplay count={count} />
<CounterButton setCount={setCount} />
</div>
);
}
function CounterDisplay({ count }) {
return <p>Счёт: {count}</p>;
}
function CounterButton({ setCount }) {
return <button onCl ick={() => setCount(prev => prev + 1)}>Увеличить</button>;
}
Ограничения подхода:
Для более крупных приложений Preact предлагает использовать глобальные состояния с помощью библиотек:
Пример использования Preact Signals:
import { signal } from '@preact/signals';
const count = signal(0);
function CounterDisplay() {
return <p>Счёт: {count.value}</p>;
}
function CounterButton() {
return <button onCl ick={() => count.value++}>Увеличить</button>;
}
Преимущества Signals:
Context позволяет создавать глобальные объекты состояния и предоставлять их компонентам через провайдер:
import { createContext } from 'preact';
import { useContext, useState } from 'preact/hooks';
const CountContext = createContext();
function App() {
const [count, setCount] = useState(0);
return (
<CountContext.Provider value={{ count, setCount }}>
<CounterDisplay />
<CounterButton />
</CountContext.Provider>
);
}
function CounterDisplay() {
const { count } = useContext(CountContext);
return <p>Счёт: {count}</p>;
}
function CounterButton() {
const { setCount } = useContext(CountContext);
return <button onCl ick={() => setCount(prev => prev + 1)}>Увеличить</button>;
}
Ограничения Context API:
При увеличении количества состояний или их взаимозависимости возникают следующие сложности:
useEffect для синхронизации состояния может приводить к
циклам обновлений.Для решения этих проблем применяются:
useMemo и
useCallback для оптимизации вычислений и
функций.Эффективное управление состоянием в Preact требует баланса между
локальными и глобальными подходами. С ростом приложения необходимо
переходить от простого useState к реактивным структурам и
контекстам, чтобы сохранить производительность и управляемость кода.