Вопрос или проблема
Мне нужно сохранить историю перемещения пользователя по сайту.
Вот мой код:
const MyReactComponent = lazy(() =>
import('./my_react-component.ui').then((module) => ({ default: module.MyReactComponent })),
)
function withSuspense<Props extends object>(
component: ComponentType<Props>,
suspenseProps: SuspenseProps & {
FallbackComponent?: ComponentType
},
) {
const Wrapped = forwardRef<ComponentType<Props>, Props>(
(props: Props, ref: ForwardedRef<ComponentType<Props>>) =>
createElement(
Suspense,
{
fallback:
suspenseProps.fallback ||
(suspenseProps.FallbackComponent &&
createElement(suspenseProps.FallbackComponent)),
},
createElement(component, { ...props, ref }),
),
);
const name = component.displayName || component.name || 'Unknown';
Wrapped.displayName = `withSuspense(${name})`;
return Wrapped;
}
const enhance = compose((component) =>
withSuspense(component, {
fallback: (
<Loader "/>
),
}),
);
export const PageRoute1: RouteObject = {
path: 'other-path/page',
element: createElement(enhance(MyReactComponent)),
}
const browserRouter = createBrowserRouter([
{
errorElement: <BubbleError />,
children: [
{
element: createElement(enhance(GenericLayout)),
children: [PageRoute1, PageRoute2],
},
{
element: createElement(enhance(EmptyLayout)),
children: [page404Route],
},
{
loader: async () => redirect(PATH_KEYS.page404),
path: '*',
},
],
}
])
Я нашел библиотеку https://github.com/verolisoft/react-router-dom-middleware, но у нее мало звезд и загрузок. И, конечно, react-router-dom позволяет реализовать это без сторонних библиотек. Как мне написать промежуточное программное обеспечение?
Ответ или решение
Промежуточное ПО для react-router-dom: Сохранение истории перемещения пользователей
Ваша задача — сохранить историю перемещения пользователей по вашему веб-сайту, и для этого вы хотите реализовать собственное промежуточное ПО для react-router-dom
. Давайте разберем, как это можно сделать без использования сторонних библиотек, используя функционал React.
Зачем нужно промежуточное ПО?
Промежуточное ПО (middleware) в контексте маршрутизации позволяет обрабатывать данные (например, события навигации) перед тем, как они достигнут компрометирующей конфигурации маршрутов. Таким образом, мы можем отслеживать, где находится пользователь, и сохранять эту информацию для дальнейшего анализа или стабильности приложения.
Реализация промежуточного ПО
Основная идея заключается в том, чтобы создавать хуки, которые будут активироваться при изменении маршрута, и сохранять эту информацию в состоянии приложения. Вот как можно этого добиться:
- Создайте свой контекст для хранения истории навигации.
- Используйте хук
useLocation
изreact-router-dom
, чтобы отслеживать изменения маршрута. - Сохраняйте информацию о маршруте в контексте.
Шаг 1: Создание контекста
import React, { createContext, useContext, useState, useEffect } from 'react';
const NavigationContext = createContext();
export const NavigationProvider = ({ children }) => {
const [history, setHistory] = useState([]);
return (
<NavigationContext.Provider value={{ history, setHistory }}>
{children}
</NavigationContext.Provider>
);
};
export const useNavigationHistory = () => {
return useContext(NavigationContext);
};
Шаг 2: Использование useLocation
Теперь, когда у нас есть контекст для хранения истории перемещения, создаем компонент-обертку, который будет следить за изменениями маршрута:
import { useLocation } from 'react-router-dom';
import { useNavigationHistory } from './NavigationContext';
const NavigationObserver = () => {
const location = useLocation();
const { history, setHistory } = useNavigationHistory();
useEffect(() => {
setHistory(prevHistory => [...prevHistory, location.pathname]);
}, [location, setHistory]);
return null;
};
Шаг 3: Интеграция с маршрутизатором
Теперь нужно обернуть ваше приложение в созданный контекст и добавить компонент-обозреватель в структуру маршрутов:
const App = () => {
return (
<NavigationProvider>
<BrowserRouter>
<NavigationObserver />
{/* Ваши маршруты здесь */}
</BrowserRouter>
</NavigationProvider>
);
};
Плюсы вашего подхода
- Отсутствие зависимостей. Вы не полагаетесь на сторонние библиотеки.
- Гибкость. Вы легко можете адаптировать логику, добавляя дополнительную информацию или изменяя способ сохранения истории.
- Прозрачность. Логика навигации сосредоточена в одном месте, что упрощает её поддержку.
Заключение
Создание промежуточного ПО для отслеживания истории маршрутов в react-router-dom
позволяет вам управлять навигацией более эффективно, сохраняя при этом контроль над внутренним состоянием приложения. Вы смогли адаптировать функционал так, как это требуется для вашего проекта, не прибегая к сторонним библиотекам, что является оптимальным решением для поддержания чистоты вашего кода и архитектуры приложения.