Как вывести массив Route в react-router-dom v6?

Рейтинг: 0Ответов: 2Опубликовано: 14.01.2023

Всем привет! Раньше использовал react-router-dom v5 и все работало, но нужно было перейти на v6 и все сломалось. В чем может быть причина? Если выводить Router не используя массив, тогда все работает.

//RouterComponent

<Routes>
    {allRoutes.map((route: IRoute) => {
              const path = Array.isArray(route.path)
                ? route.path.filter((item: string) => item === pathname && item)[0]
                : route.path;

              const authorization = (route: IRoute): boolean => {
                if (route.isAuth) return auth;
                if (route.isAdmin) return staff;
                if (route.protectRouteBasket) return basketIsNotEmpty;
                return false;
              };

              const protectedRoutes = route.isAdmin || route.isAuth || route.protectRouteBasket;
   
              return protectedRoutes ? (
                <Route
                  key={route.name}
                  element={
                    <ProtectedRoute authorization={authorization(route)}>
                      {<Route element={route.component} path={path} />}
                    </ProtectedRoute>
                  }
                />
              ) : (
                <Route
                  path={typeof route.path}
                  key={route.name}
                  element={route.component}
                />
              );
            })}
</Routes>

//config

export const allRoutes: IRoute[] = [
  { component: Main, path: "/", name: "main", isAdmin: false, isAuth: false },
  { component: AboutMe, path: "/aboutMe", name: "aboutMe", isAdmin: false, isAuth: false },
...
]

//ProtectedRoute

export const ProtectedRoute: React.FC<PropsProtectedRoute> = ({ authorization, children }) => {
  return authorization ? children : <Navigate to="/" />;
};

//Так работает

<Route path="*" element={<NotFound />} />

Ответы

▲ 0

Обновленный <Route/> в react-router-dom v6 принимает компонент в таком виде

<Route element={<Home/>} />, а вы передаете element={Home}.

Вам привести компоненты в массиве к виду:

export const allRoutes: IRoute[] = [
  { component: <Main/>, path: "/", name: "main", isAdmin: false, isAuth: false },
  { component: <AboutMe/>, path: "/aboutMe", name: "aboutMe", isAdmin: false, isAuth: false },
...
]

Т.е. поменять Main на <Main/> и т.д.

▲ 0

Решил проблему. В общем, проблема была в путях и в иcпользовании параметра index.