Программная навигация является ключевым элементом современных
одностраничных приложений (SPA), позволяя изменять состояние интерфейса
и URL без перезагрузки страницы. В Preact она реализуется через роутинг,
чаще всего с использованием официального пакета
preact-router.
Для начала необходимо установить роутер:
npm install preact-router
Импортируются компоненты следующим образом:
import { h } from 'preact';
import { Router, route } from 'preact-router';
Router отвечает за обработку маршрутов, а функция
route используется для программной навигации.
Простейший пример конфигурации маршрутов:
const App = () => (
<div>
<Router>
<Home path="/" />
<About path="/about" />
<Profile path="/profile/:user" />
</Router>
</div>
);
path указывает путь маршрута.:user) позволяют передавать
динамические значения.routeФункция route позволяет перемещаться между страницами
без участия пользователя:
import { route } from 'preact-router';
const navigateToProfile = (username) => {
route(`/profile/${username}`);
};
Особенности использования:
true заменяет историю браузера:route('/about', true); // заменяет текущий URL, не добавляя новую запись в историю
useState или useReducer):const [user, setUser] = useState(null);
const handleLogin = (username) => {
setUser(username);
route(`/profile/${username}`);
};
preact-router автоматически обрабатывает обычные ссылки
<a> при использовании атрибута href, но
можно управлять переходами через Link-компонент:
import { Link } from 'preact-router/match';
<Link href="/about">О проекте</Link>
Преимущества Link:
activeClassName.Пример с активным классом:
<Link href="/profile/john" activeClassName="active">
Профиль Джона
</Link>
Для динамических маршрутов параметры извлекаются из пропсов:
const Profile = ({ user }) => (
<div>Профиль пользователя: {user}</div>
);
Для обработки query-параметров можно использовать встроенные возможности браузера:
import { useEffect } from 'preact/hooks';
const Search = ({ url }) => {
useEffect(() => {
const params = new URLSearchParams(url.split('?')[1]);
const query = params.get('q');
console.log(query);
}, [url]);
return <div>Результаты поиска</div>;
};
Часто необходимо менять маршрут после выполнения асинхронной операции или проверки условий:
const handleSubmit = async (formData) => {
const result = await api.sendData(formData);
if (result.success) {
route('/success');
} else {
route('/error');
}
};
Такой подход позволяет контролировать логику переходов в зависимости от состояния приложения.
Для обработки 404-страниц используется специальный путь без указания
path:
<Router>
<Home path="/" />
<About path="/about" />
<NotFound default />
</Router>
Компонент с атрибутом default будет отображаться при
любом маршруте, который не совпадает с существующими.
Интеграция preact-router с хуками позволяет создавать
более сложные сценарии:
import { useEffect } from 'preact/hooks';
const RedirectIfNotLogged = ({ user }) => {
useEffect(() => {
if (!user) {
route('/login');
}
}, [user]);
return null;
};
Такой компонент можно размещать в любой части приложения, чтобы автоматически перенаправлять пользователей при определённых условиях.
import { lazy } from 'preact/compat';
const About = lazy(() => import('./About'));
Сохранение состояния при навигации – важно
управлять состоянием компонентов через useState или
глобальные менеджеры состояния, чтобы при переходе между маршрутами не
терялись данные.
События навигации – preact-router
предоставляет onChange для отслеживания всех
переходов:
<Router onCha nge={(e) => console.log('New route:', e.url)}>
...
</Router>
Это позволяет выполнять действия при каждом изменении маршрута, например, аналитика или сброс состояния форм.
Программная навигация в Preact предоставляет гибкие возможности
управления маршрутами, позволяет создавать динамичные SPA с минимальными
затратами ресурсов и высокой производительностью. Использование
route, Router и связанных инструментов
обеспечивает полное управление переходами, параметрами URL и состоянием
приложения.