Как сделать карту для React-Router с помощью функции?

Я пытаюсь создать несколько настраиваемых маршрутов для компонентов с защищенной функцией, но маршрут не работает:

import React from "react";
import "./styles.css";
import { BrowserRouter, Switch, Route, useHistory } from "react-router-dom";

const RoutesRender = ({ Routes }) => {
    const History = useHistory();

    if (Routes.AuthRequired) {
        History.push("/login");
        return null;
    } else {
        return (
            <Route exact path = {Routes.Path} render = {(props) => <Routes.Component {...props} />} />
        );
    }
};

const RoutesProvider = () => {
    return (
        <React.Fragment>
            <BrowserRouter>
                <Switch>
                    {[
                        {
                            Path: "/login",
                            Component: () => <div>"login"</div>,
                            Title: "Login",
                            AuthRequired: false
                        },{
                            Path: "/register",
                            Component: () => <div>"register"</div>,
                            Title: "Register",
                            AuthRequired: false
                        },{
                            Path: "/",
                            Component: () => <div>"root"</div>,
                            Title: "Janus Chat",
                            AuthRequired: true
                        }
                    ].map((Routes, Index) => (
                        <RoutesRender Routes = {Routes} key = {Index} />
                    ))}
                </Switch>
            </BrowserRouter>
        </React.Fragment>
    );
};

export default function App() {
    return <div className = "App">{RoutesProvider()}</div>;
}

Он не показывает никаких ошибок, он показывает первый объект из массива и не зацикливается на других. если я поставлю маршрут внутри карты, это сработает, но если я вставлю функцию, она не сработает.

{RoutesMaster.map((Routes, Index) => (
    <Route exact key = {Index} path = {Routes.Path} render = {(props) => <Routes.Component {...props} />}/> 
))}
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
0
1 313
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Попробуйте это, это работает.

import React from "react";
import { Route, Switch, Redirect, BrowserRouter } from "react-router-dom";

const mapRouter = [
  {
    path: "/login",
    component: () => <div>"login"</div>,
    title: "Login",
    isPrivate: false,
  },
  {
    path: "/register",
    component: () => <div>"register"</div>,
    title: "Register",
    isPrivate: false,
  },
  {
    path: "/",
    component: () => <div>"root"</div>,
    title: "Janus Chat",
    isPrivate: true,
  },
];

const PrivateRoute = (props) => {
  const userId = false; // This determines whether the user is logged in or not.

  return userId ? (
    <Route path = {props.path} exact = {props.exact} render = {props.component} />
  ) : (
    <Redirect to = "/login" />
  );
};

const Router = () => (
  <BrowserRouter>
    <Switch>
      {mapRouter.map(({ component, exact, path, isPrivate }, index) =>
        isPrivate ? (
          <PrivateRoute
            key = {index}
            component = {component}
            path = {path}
            exact = {exact}
          />
        ) : (
          <Route key = {index} path = {path} exact = {exact} render = {component} />
        )
      )}
    </Switch>
  </BrowserRouter>
);

Другие вопросы по теме