TanStack Router предоставляет мощные возможности для организации маршрутизации в приложениях на JavaScript и TypeScript. Одной из ключевых особенностей современных SPA является возможность интеграции состояния маршрутизатора с глобальным состоянием приложения. Redux, как популярный инструмент управления состоянием, может эффективно взаимодействовать с TanStack Router для синхронизации URL, состояния маршрутов и данных компонентов.
Для синхронизации TanStack Router с Redux необходимо учитывать два аспекта:
TanStack Router не имеет встроенной зависимости от Redux, но его API позволяет легко создавать события и подписки, которые интегрируются с Redux.
Простейший способ интеграции – создание middleware или listener для действий маршрутизатора. Основные шаги:
import { configureStore } from '@reduxjs/toolkit';
import routerReducer from './routerSlice';
export const store = configureStore({
reducer: {
router: routerReducer
}
});
import { createSlice } from '@reduxjs/toolkit';
const routerSlice = createSlice({
name: 'router',
initialState: {
pathname: '/',
params: {},
search: ''
},
reducers: {
setRouteState(state, action) {
const { pathname, params, search } = action.payload;
state.pathname = pathname;
state.params = params;
state.search = search;
}
}
});
export const { setRouteState } = routerSlice.actions;
export default routerSlice.reducer;
onNavigate:import { createRouter } from '@tanstack/router';
import { store } from './store';
import { setRouteState } from './routerSlice';
const router = createRouter({
routes: [
// определения маршрутов
],
onNavigate: (context) => {
store.dispatch(setRouteState({
pathname: context.location.pathname,
params: context.match?.params || {},
search: context.location.search
}));
}
});
Чтобы не только обновлять Redux при навигации, но и позволять изменять маршрут через Redux, можно создать middleware, который будет реагировать на изменения состояния маршрута:
store.subscribe(() => {
const { pathname, params, search } = store.getState().router;
const currentPath = router.state.location.pathname;
if (currentPath !== pathname) {
router.navigate({
to: pathname,
params,
search
});
}
});
Такой подход обеспечивает полную синхронизацию между состоянием Redux и маршрутизатором, предотвращая рассинхронизацию URL и состояния приложения.
navigate.TanStack Router предоставляет удобные методы для работы с параметрами
маршрута и query-параметрами. При синхронизации с Redux можно хранить их
в объекте params и search. Для преобразования
query строки в объект удобно использовать
URLSearchParams:
const searchParams = Object.fromEntries(new URLSearchParams(location.search));
store.dispatch(setRouteState({
pathname: location.pathname,
params: routeParams,
search: searchParams
}));
При использовании TypeScript рекомендуется типизировать состояние маршрута:
interface RouterState {
pathname: string;
params: Record<string, string>;
search: Record<string, string>;
}
const initialState: RouterState = {
pathname: '/',
params: {},
search: {}
};
Типизация позволяет избежать ошибок при доступе к параметрам маршрута и гарантирует корректную синхронизацию с Redux.
navigate, избегая циклических обновлений.Эти подходы позволяют создавать сложные SPA с TanStack Router и Redux, сохраняя согласованность состояния, URL и логики приложения.