History API — это встроенный интерфейс браузера, позволяющий управлять историей навигации веб-приложений без полной перезагрузки страницы. Он является частью спецификации HTML5 и широко используется в современных одностраничных приложениях (SPA), включая проекты на библиотеке Haunted, где реактивные компоненты требуют синхронизации состояния с URL.
1. history.pushState(state, title, url)
Добавляет новое состояние в историю браузера, изменяя URL без
перезагрузки страницы.
state — объект с произвольными данными, который будет
доступен при событии popstate.title — пока игнорируется большинством браузеров, но
может использоваться для SEO или внутренней логики.url — новый URL, который будет отображен в адресной
строке.Пример использования:
history.pushState({ page: 2 }, "Страница 2", "/page2");
После выполнения этого кода браузер покажет /page2, но
контент страницы изменится только при ручном управлении через JS.
2.
history.replaceState(state, title, url) Аналогичен
pushState, но заменяет текущее состояние, не создавая новую
запись в истории.
Пример:
history.replaceState({ page: 1 }, "Страница 1", "/page1");
Используется для корректировки URL или состояния без добавления нового шага в историю.
3. Навигация через методы back,
forward и go
history.back() — переход к предыдущей записи в
истории.history.forward() — переход к следующей записи.history.go(n) — переход на n шагов вперед
или назад.Пример:
history.go(-1); // вернуться на одну страницу назад
popstateОсновной инструмент для отслеживания изменений истории. Срабатывает
при навигации с помощью кнопок «Назад»/«Вперед» браузера или вызова
history.go().
window.addEventListener('popstate', (event) => {
console.log("Новое состояние:", event.state);
});
event.state содержит объект состояния, переданный в
pushState или replaceState.В Haunted компоненты строятся на реактивных хуках.
History API можно использовать для синхронизации состояния с URL через
useEffect или пользовательские хуки.
Пример пользовательского хука для Haunted:
import { useState, useEffect } from 'haunted';
function useHistoryState(defaultState, urlPath) {
const [state, setState] = useState(defaultState);
useEffect(() => {
const handlePopState = (event) => {
setState(event.state || defaultState);
};
window.addEventListener('popstate', handlePopState);
return () => window.removeEventListener('popstate', handlePopState);
}, []);
const pushState = (newState, newUrl) => {
history.pushState(newState, '', newUrl);
setState(newState);
};
return [state, pushState];
}
Использование в компоненте Haunted:
import { html, component } from 'haunted';
function Page() {
const [pageState, setPageState] = useHistoryState({ page: 1 }, '/page1');
return html`
<div>
<p>Текущая страница: ${pageState.page}</p>
<button @click=${() => setPageState({ page: 2 }, '/page2')}>Перейти на страницу 2</button>
</div>
`;
}
customElements.define('my-page', component(Page));
pushState или replaceState можно
привязывать к реактивным хукам, обеспечивая синхронизацию интерфейса и
URL без перезагрузки.pushState для добавления новых страниц и
состояний, replaceState для корректировки текущего
состояния без создания нового шага истории.popstate для восстановления состояния
интерфейса при навигации назад или вперёд.History API является ключевым инструментом для SPA и компонентов Haunted, обеспечивая полноценное управление навигацией без полной перезагрузки страницы и позволяя создавать динамичные, отзывчивые интерфейсы.