TanStack Router предоставляет мощные возможности маршрутизации в приложениях на JavaScript, обеспечивая декларативное управление маршрутами и их состоянием. При работе с MobX возникает потребность в синхронизации состояния маршрутизатора с реактивными хранилищами, что позволяет управлять переходами и данными маршрутов через наблюдаемые объекты.
Создание хранилища начинается с определения наблюдаемых свойств, которые будут хранить текущий маршрут, параметры и состояние загрузки:
import { makeAutoObservable } from "mobx";
class RouterStore {
currentRoute = "/";
params = {};
isLoading = false;
constructor() {
makeAutoObservable(this);
}
setRoute(route, params = {}) {
this.currentRoute = route;
this.params = params;
}
startLoading() {
this.isLoading = true;
}
stopLoading() {
this.isLoading = false;
}
}
export const routerStore = new RouterStore();
В этом примере currentRoute хранит текущий путь, а
params — параметры маршрута. Методы
startLoading и stopLoading помогают
отслеживать состояние асинхронной загрузки при переходах.
Для интеграции TanStack Router с MobX создаётся реактивная подписка на изменения маршрутов:
import { Router } from "@tanstack/router";
import { routerStore } from "./RouterStore";
const router = new Router({
// определение маршрутов
});
router.subscribe(({ location }) => {
routerStore.setRoute(location.pathname, location.params);
});
router.subscribe обеспечивает автоматическое обновление
состояния хранилища при смене маршрута. Это позволяет компонентам,
наблюдающим за MobX-хранилищем, реагировать на изменения маршрутов без
прямого обращения к TanStack Router.
Чтобы компоненты корректно реагировали на изменения маршрутов и
состояния загрузки, используется обёртка observer из
MobX:
import { observer } from "mobx-react-lite";
import { routerStore } from "./RouterStore";
const Navigation = observer(() => {
return (
<nav>
<span>Текущий маршрут: {routerStore.currentRoute}</span>
{routerStore.isLoading && <span>Загрузка...</span>}
</nav>
);
});
Любые изменения в routerStore.currentRoute или
routerStore.isLoading автоматически вызывают перерисовку
компонента, обеспечивая синхронизацию интерфейса с маршрутизатором.
TanStack Router поддерживает асинхронные загрузки данных перед переходом на новый маршрут. При использовании MobX это удобно сочетать с реактивными состояниями загрузки:
const loadDataForRoute = async (route) => {
routerStore.startLoading();
try {
const data = await fetch(`/api/${route}`);
routerStore.setRoute(route, { data });
} finally {
routerStore.stopLoading();
}
};
Такой подход гарантирует, что состояние загрузки всегда актуально, а данные маршрута остаются синхронизированными с MobX-хранилищем.
Навигацию можно полностью контролировать из хранилища, создавая методы для переходов на разные маршруты:
class RouterStore {
// ... предыдущие свойства и методы
navigateTo(route, params = {}) {
router.navigate({ to: route, params });
this.setRoute(route, params);
}
}
Теперь любой компонент может вызывать
routerStore.navigateTo("/dashboard"), обеспечивая
согласованное обновление состояния маршрута и TanStack Router.
TanStack Router позволяет создавать вложенные маршруты, а MobX упрощает управление состоянием каждого уровня:
class NestedRouterStore {
currentParent = "/";
currentChild = "";
constructor() {
makeAutoObservable(this);
}
setParentRoute(parent) {
this.currentParent = parent;
this.currentChild = "";
}
setChildRoute(child) {
this.currentChild = child;
}
}
export const nestedRouterStore = new NestedRouterStore();
Вложенные маршруты могут использовать реактивные свойства
currentParent и currentChild для условного
рендеринга компонентов, что упрощает управление сложной маршрутизацией в
больших приложениях.
observer для автоматической
перерисовки.Эта структура обеспечивает полную реактивную интеграцию маршрутизатора и MobX, позволяя строить сложные интерфейсы с управляемым состоянием маршрутов и данных.