Программная навигация в Mithril.js реализуется через встроенный
объект m.route, который управляет состоянием маршрутизатора
и позволяет изменять URL без полной перезагрузки страницы. В отличие от
стандартных ссылок <a>, использование программной
навигации обеспечивает динамическую подгрузку компонентов и поддерживает
одностраничное приложение (SPA).
m.routem.route.set(path, params, options)
Позволяет программно изменить маршрут.
path — строка с новым URL или именем маршрута.params — объект с параметрами маршрута
(опционально).options — объект с дополнительными настройками
(например, replace: true, чтобы не добавлять запись в
историю браузера).Пример:
m.route.set("/users", { id: 42 });m.route.get() Возвращает текущий
путь маршрута, включая параметры query.
let currentPath = m.route.get();
console.log(currentPath); // "/users?id=42"m.route.param(key) Извлекает
значение параметра маршрута по ключу.
let userId = m.route.param("id"); // 42Маршруты в Mithril настраиваются при инициализации приложения через
m.route(document.body, defaultRoute, routes).
document.body — контейнер, куда будут
рендериться компоненты.defaultRoute — маршрут, используемый
по умолчанию.routes — объект, связывающий путь с
компонентом.Пример конфигурации маршрутов:
m.route(document.body, "/home", {
"/home": HomeComponent,
"/users/:id": UserComponent,
"/settings": SettingsComponent
});
Параметры маршрута (:id) становятся доступны через
m.route.param("id").
Для динамической навигации в SPA важно использовать программные
методы вместо обычных ссылок <a href="/path">. В
противном случае браузер выполнит полную перезагрузку страницы. Вместо
этого применяется:
m("button", {
onclick: () => m.route.set("/settings")
}, "Перейти в настройки");
Этот подход позволяет сохранять состояние приложения и избегать лишних HTTP-запросов.
Mithril поддерживает query-параметры через объект params
в m.route.set():
m.route.set("/users", { id: 42, filter: "active" });
Для чтения query-параметров:
let filter = m.route.param("filter"); // "active"
Для удаления параметра достаточно передать
undefined:
m.route.set("/users", { filter: undefined });
replaceПо умолчанию m.route.set() добавляет новую запись в
историю браузера. Для замены текущего маршрута используется опция
replace:
m.route.set("/home", {}, { replace: true });
Это полезно для редиректов после авторизации или при изменении состояния без возможности возвращения назад.
Внутри компонентов можно комбинировать обработчики событий с
m.route.set() для построения сложной логики:
const UserCard = {
view: (vnode) =>
m("div", [
m("h3", vnode.attrs.name),
m("button", {
onclick: () => m.route.set("/users/" + vnode.attrs.id)
}, "Подробнее")
])
};
Каждый компонент может иметь собственные обработчики навигации, что упрощает поддержку и масштабирование приложения.
Иногда требуется проверить текущий маршрут для условного рендеринга:
if (m.route.get() === "/home") {
// выполнить какие-то действия
}
Также можно комбинировать с query-параметрами для тонкой настройки логики:
if (m.route.param("id") === "42") {
// особое поведение для пользователя с id=42
}
Mithril автоматически работает с History API
(pushState/replaceState) и
hash-маршрутизацией. Можно выбрать стратегию при инициализации:
m.route.prefix = ""; // отключение хеша, использование "чистых" URL
Использование m.route.prefix позволяет интегрировать SPA
с серверными маршрутами и SEO.
m.route.set() вместо <a> для сохранения
состояния SPA.replace: true при редиректах после
операций авторизации или изменения параметров, чтобы не захламлять
историю браузера.m.route.param() перед использованием, чтобы избежать ошибок
при динамических маршрутах.Программная навигация в Mithril.js обеспечивает гибкий и надежный способ управления состоянием приложения и URL без полной перезагрузки страницы, позволяя строить высокопроизводительные одностраничные приложения с чистой и поддерживаемой архитектурой.