PrivateRoute не работает в ReactJS

Я полностью застрял при интеграции PrivateRoute HOC в свой проект react.js.

Вот мой файл маршрут

import React, { Component } from "react";
import { Route, Redirect, Switch, BrowserRouter as Router } from 'react-router-dom';
import Dashboard from "../view/Dashboard/Dashboard";
import Login from "../view/Login/Login";
import Admin from "../view/UserManagement/Admin";
import cookie from 'react-cookies'

const PrivateRoute = ({ component, ...rest }) => {
  const isAuthed = cookie.load('token')
  console.info(isAuthed, 'dddddddddddddddddddd')
  return (
    <Route {...rest} exact
      render = {(props) => (
        isAuthed ? (
          <div>
            {React.createElement(component, props)}
          </div>
        ) :
        (
          <Redirect
            to = {{
              pathname: '/login',
              state: { from: props.location }
            }}
          />
        )
      )}
    />
  )
}

class MainPanel extends Component {

  render() {
    return (
      <div style = {{ direction: direction }}> 
        <Router>
          <Switch>
            <Route path = "/login" component = {Login}/>
            <PrivateRoute path = "/" component = {Dashboard} />
            <PrivateRoute path = "/AdminManagement" component = {Admin} />
           </Switch>
        </Router>
      </div>
    )
  }
}
export default withNamespaces('common') (MainPanel);

Я полностью сломал себе голову этим, но не избавился от этой проблемы. Почему моя консоль внутри PrivateRoute не показывает значения

Есть ли проблемы с версиями react и react-router-dom?

Заранее спасибо!!!

Вы имеете в виду, что когда вы переходите к компоненту Dashboard или Admin, журнал консоли ничего не печатает?

dnp1204 08.02.2019 15:26

Вы пытались получить доступ к панели инструментов или странице администратора, чтобы активировать этот console.info?

Weedoze 08.02.2019 15:28

@dnp1204 да, ты прав

Profer 09.02.2019 03:58

@Weedoze да, но это ничего не утешает

Profer 09.02.2019 03:59

Вы получаете какую-либо ошибку в консоли

Shubham Khatri 11.02.2019 07:14

@ShubhamKhatri Нет, сэр, в консоли нет ошибки.

Profer 11.02.2019 07:20

Не могли бы вы подготовить демонстрацию, которая воспроизводит вашу ошибку

Shubham Khatri 11.02.2019 07:28

@ShubhamKhatri Есть ли место, где я могу создать скрипку?

Profer 11.02.2019 07:36
codeandbox.io/s/новый
Shubham Khatri 11.02.2019 07:37

@ShubhamKhatri Пожалуйста, посмотрите codeandbox.io/s/1zx57kl594

Profer 11.02.2019 07:47

Давайте продолжить обсуждение в чате.

Shubham Khatri 11.02.2019 07:49

попробуйте это решение stackoverflow.com/a/54626313/10761855

Vadim Hulevich 11.02.2019 09:14
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
15
12
7 755
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вот как я обрабатываю свои частные маршруты, возможно, это поможет и вам. У меня есть protectedRoutes в виде массива с маршрутами. вы можете подогнать их по своему усмотрению.

const routes = [
  {
    path: '/login', exact: true, name: 'Login', component: Login,
  },
];

const protectedRoutes = [
  {
    path: '/admin', exact: true, name: 'Admin', component: Admin,
  },
];

<Switch>

    {routes.map((route, idx) => (route.component ? (
         <Route
             key = {idx}
             path = {route.path}
             exact = {route.exact}
             name = {route.name}
             render = {props => (
             <route.component {...props} />
             )}
          />
            )
     : (null)))}

     {protectedRoutes.map((route, idx) => (route.component ? (
          <Route
              key = {idx}
              path = {route.path}
              exact = {route.exact}
              name = {route.name}
              render = {props => (
                isAuth
                  ? <route.component {...props} />
                  : <Redirect to = "/login" />
                )}
           />
       )
       : (null)))}
        
</Switch>

LE: добавлен полный пример на основе исходного кода

import React, { Component } from 'react';
import { Route, Redirect, Switch, BrowserRouter as Router } from 'react-router-dom';
import Dashboard from '../view/Dashboard/Dashboard';
import Login from '../view/Login/Login';
import Admin from '../view/UserManagement/Admin';
import cookie from 'react-cookies';

const routes = [
  {
    path: '/login', exact: true, name: 'Login', component: Login,
  },
];

const protectedRoutes = [
  {
    path: '/', exact: true, name: 'Dashboard', component: Dashboard,
  },
  {
    path: '/AdminManagement', exact: true, name: 'Admin', component: Admin,
  },
];

class MainPanel extends Component {

  constructor(props) {
    super(props);
    this.state = {
      isAuthed: cookie.load('token'),
    },
  };

  render() {
    const { isAuthed } = this.state;
    return (
      <div style = {{ direction: direction }}>
        <Router>
          <Switch>
            {routes.map((route, idx) => (route.component ? (
                <Route
                  key = {idx}
                  path = {route.path}
                  exact = {route.exact}
                  name = {route.name}
                  render = {props => (
                    <route.component {...props} />
                  )}
                />
              )
              : (null)))}

            {protectedRoutes.map((route, idx) => (route.component ? (
                <Route
                  key = {idx}
                  path = {route.path}
                  exact = {route.exact}
                  name = {route.name}
                  render = {props => (
                    isAuth
                      ? <route.component {...props} />
                      : <Redirect to = "/login" />
                  )}
                />
              )
              : (null)))}
          </Switch>
        </Router>
      </div>
    )
  }
}

export default withNamespaces('common')(MainPanel);

Это не отвечает на вопрос ОП

Weedoze 08.02.2019 15:41

Это просто другой подход к рассматриваемой проблеме. Я согласен, что это не отвечает на вопрос, но может помочь достичь желаемого результата. Если нет, я с удовольствием удалю ответ

Sabbin 08.02.2019 15:43
Ответ принят как подходящий

Компонент PrivateRoute, который у вас есть, правильный, однако вам нужно только повторно заказать Routes, чтобы они работали правильно. Маршрут /AdminManagement должен предшествовать /, поскольку Switch отображает первый соответствующий маршрут, а Route path также будет соответствовать его пути префикса.

class MainPanel extends Component {

  render() {
    return (
      <div style = {{ direction: direction }}> 
        <Router>
          <Switch>
            <Route path = "/login" component = {Login}/>
            <PrivateRoute path = "/AdminManagement" component = {Admin} />
            <PrivateRoute path = "/" component = {Dashboard} />
           </Switch>
        </Router>
      </div>
    )
  }
}
export default withNamespaces('common') (MainPanel);

Рабочая демонстрация

Спасибо... Но это работает частично. Он всегда перенаправляет меня на /login. Почему так?

Profer 11.02.2019 08:32

@Profer, потому что localStorage должен быть установлен при входе в систему, иначе он никогда не будет работать.

Shubham Khatri 11.02.2019 08:38

@Profer, смогли ли вы решить вышеуказанную проблему с помощью приведенного выше ответа.

Shubham Khatri 14.02.2019 11:46

@Profer, не беспокойся о награде. Я не получил от вас никакого ответа после моего последнего комментария, поэтому я хотел подтвердить

Shubham Khatri 14.02.2019 11:57
не получил никакого ответа от вас после моего последнего комментария Извиняюсь за это
Profer 14.02.2019 12:06
/AdminManagement route should come before / since Switch renders the first matching Route and a Route path will also match its prefix path, поэтому /AdmingManagement также соответствует /, и, следовательно, Admin не будет отображаться, но Dashboard всегда будет отображаться в вашем случае.
Shubham Khatri 18.02.2019 19:31

попробуйте сменить библиотеку на react-cookie;

let PrivateRoute = ({ component: Component, cookies, ...rest }) => (
  <Route
    {...rest}
    render = {props =>
      cookies.get("name") ? (
        <Component {...props} />
      ) : (
        <Redirect
          to = {{
            pathname: "/login",
            state: { from: props.location }
          }}
        />
      )
    }
  />
);

https://codesandbox.io/s/015k0jl0ql

Это не отвечает на вопрос ОП + ОП уже использует библиотеку реагирования на файлы cookie.

Weedoze 11.02.2019 11:41

Почему нет? если вы измените lib, вы можете увидеть данные в console.info из файла cookie

Vadim Hulevich 11.02.2019 11:43

OP нужно решение с текущими библиотеками. Другая библиотека не нужна для решения его проблемы.

Weedoze 11.02.2019 11:46

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