Как сопоставлять маршруты в маршрутизаторе React с защищенной функцией?

#reactjs #react-router #react-hooks #react-router-dom

#reactjs #react-маршрутизатор #реагирующие хуки #react-router-dom

Вопрос:

Я пытаюсь обработать свой код с помощью маршрута React в map и защищенной функции;

Это массив для компонентов;

 import LoginContainers from "../Containers/LoginContainers/LoginContainers";
import RegisterContainers from "../Containers/RegisterContainers/RegisterContainers";
import ChattingApp from "../Containers/ChattingApp/ChattingApp";

const RoutesMaster = [
    {
        Path: '/login',
        Component: LoginContainers,
        Title: 'Login',
        AuthRequired: false
    },{
        Path: '/register',
        Component: RegisterContainers,
        Title: 'Register',
        AuthRequired: true
    },{
        Path: '/',
        Component: ChattingApp,
        Title: 'Janus Chat',
        AuthRequired: true
    },
]
 

И это код в основном компоненте;

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

const RoutesRender = (Routes, Key) => {
    const History = useHistory();

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

const RoutesProvider = () => {
    return (
    <React.Fragment>
        <BrowserRouter>
            <Switch>
                {RoutesMaster.map((Routes, Index) => (
                    <RoutesRender Routes={Routes} Key={Index} />
                ))}
            </Switch>
        </BrowserRouter>
    </React.Fragment>
);
}

export default RoutesProvider;
 

Но это показывает это сообщение;
«Ошибка: недопустимый тип элемента: ожидаемая строка (для встроенных компонентов) или класс / функция (для составных компонентов), но получено: не определено. Вероятно, вы забыли экспортировать свой компонент из файла, в котором он определен, или, возможно, перепутали импорт по умолчанию и именованный импорт. Проверьте метод визуализации Router.Consumer

Ответ №1:

Вы возвращаете undefined или, скорее, ничего не возвращаете в методе RoutesRender , и react требует, чтобы вы возвращались, по крайней мере null , в VDOM.

Вот ваш код с изменениями и комментариями, чтобы увидеть, где он находится:

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

  if (Routes.AuthRequired) {
    History.push('/auth/login');
    return null; // This is return value that is needed
  } else {
    return <Route exact key={Key} path={Routes.Path} render={(props) => <Routes.Component {...props} />} />;
  }
};
 

Комментарии:

1. Можете ли вы отредактировать свой вопрос и добавить код для других компонентов. Может быть, вы не возвращаете содержимое компонента

2. если я помещу маршрут внутри карты, это сработает, но если я введу функцию, она не будет работать

3. {RoutesMaster.map((Маршруты, индекс) => ( <Точный ключ маршрута ={Индекс} путь ={Маршруты. Путь} render={(props) => <Маршруты. Компонент {…реквизит} />} /> ))}

4. Спасибо за ваше время, я пытаюсь, чтобы цикл не работал, просто показываю первый объект из массива

5. Спасибо за ваше время и вашу помощь