PrivateRoute в реакции-роутер-дом: 6.8.0

Я создаю собственное приложение PrivateRoute для чата. Вот мой PrivateRoute:

import { useState, useEffect } from 'react';
import { Route, Navigate } from 'react-router-dom';
import axios from 'axios';

interface PrivateRouteProps {
  element: React.ComponentType<any>;
  path: string;
}

export function PrivateRoute({ element: Element, path }: PrivateRouteProps) {
  const [authenticated, setAuthenticated] = useState(false);

  useEffect(() => {
    axios
      .get('http://golang:8080')
      .then((response) => {
        if (response.status === 200) {
          setAuthenticated(true);
        }
      })
      .catch((error) => {
        console.info(error);
      });
  }, []);

  return (
    <Route
      path = {path}
      element = {
        authenticated ? <Element /> : <Navigate to = "/login" replace = {true} />
      }
    />
  );
}

Как я его использую: <PrivateRoute path = {RouterPath.ROOT} element = {Main} />

Изображение моего кода:

Когда я создаю свой проект в консоли, у меня возникают следующие ошибки: Экран Итак, как использовать пользовательский PrivateRoute?

Вы делаете это наоборот

Konrad 18.05.2023 13:02

Смотрите также stackoverflow.com/questions/66289122/…

Konrad 18.05.2023 13:03

Спасибо, но эти ответы мне не помогли.

dkobzar 18.05.2023 13:20
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
3
52
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Вот как вы можете изменить свой частный компонент маршрута, он будет решать только отображать дочерние элементы или нет, никаких реквизитов

import { PropsWithChildren } from 'react'

export function PrivateRoute({ children }: PropsWithChildren) {
 const [authenticated, setAuthenticated] = useState(false);
 useEffect(() => {
    axios
      .get('http://golang:8080')
      .then((response) => {
        if (response.status === 200) {
          setAuthenticated(true);
        }
      })
      .catch((error) => {
        console.info(error);
      });
  }, []);

  return <>
     authenticated ? (
        children
     ) : (
        <Navigate to = "/login" replace = {true} />
     )
    </>
}

Тогда используйте его таким образом

<Route path = {path}>
  <Route path = {RouterPath.ROOT} element = {<PrivateRoute><Main/></PrivateRoute>}/>        
</Route>

Спасибо, все работает отлично, но <PrivateRoute> подчеркивает красную строку и говорит: PrivateRoute cannot be used as a JSX component. Its return type 'string | number | boolean | ReactFragment | Element | null | undefined' is not a valid JSX element. Type 'undefined' is not assignable to type ''Element | null.

dkobzar 18.05.2023 13:35

Вы можете обернуть его в reactFragment, позвольте мне изменить ответ и показать вам, как

Fateh Mohamed 18.05.2023 13:41

Можете ли вы проверить сейчас, это должно решить проблему с набором текста

Fateh Mohamed 18.05.2023 13:43
authenticated изначально имеет значение false, поэтому перенаправление всегда будет отображаться до того, как useEffect сможет запуститься и проверить, аутентифицирован ли пользователь, и обновить состояние authenticated. Эта реализация ошибочна.
Drew Reese 18.05.2023 17:37

Ответ был о маршрутизаторе, а не о всей реализации

Fateh Mohamed 18.05.2023 21:10

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