Перенаправление на маршрут внутри функции React Router Dom

У меня есть кнопка с событием щелчка, которое вызывает функцию, которая заставляет API входить в систему пользователя после того, как пользователь успешно вошел в систему. Я хочу перенаправить пользователя на /overview. Я не совсем уверен, как это сделать с react-router-dom, все, что я видел, было с react-router и с использованием Class Based Component, а не Function Based Component, как я использую.

Ниже показано, как настроены мои маршруты.

import React from "react";
import { BrowserRouter as Router, Route } from 'react-router-dom';
import Login from "../../login/Login";
import Main from "../../main/Main";

const App = () => {

   return (
      <div className = "App">
         <Router>
            <div className = "App-container">
               <Route path = {"/login"} component = {() => <Login />} />
               <Route exact path = {"/overview"} component = {Main} />
            </div>
         </Router>
      </div>
   );

}

export default App;

Вот мой компонент LoginCard (внутри компонента входа) с кнопкой и функцией с вызовом API

import React from 'react';
import { BrowserRouter as Router, Route, Redirect, Link } from 'react-router-dom';
import Button from '../button/Button';
import LoginService from '../../api/LoginService';

const LoginCard = (props) => {

   const loginService = new LoginService();

   const handleLogin = () => {
      loginService.login(email, password)
         .then((response) => {
            // Want to redirect here?
         });
   }

   return (
      <div className = "Login">
         <Button onClick = {handleLogin}>Login</Button>
      </div>
   );
};

export default LoginCard;

Вот что я пробовал, но не работал, глядя на другие темы.

<Redirect to = "/overview"/><Redirect to = {{ pathname: '/overview' }} />

Я также видел, как люди упоминали props.location или this.props.location, что для меня не определено.

Пытался добавить

import createBrowserHistory from "history/createBrowserHistory";
const history = createBrowserHistory();
<Router history = {history}>

в App.js и использование history.push Но получил ошибку, говорящую, что это не функция.

Так что не совсем уверен, как это сделать? Я бы предпочел решить это только с помощью react-router-dom или через Function Based Component. Любая помощь будет принята с благодарностью.

Поведение ключевого слова "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) для оценки ваших знаний,...
1
0
9 681
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

Поскольку LoginCard является дочерним компонентом Login, он не получит доступ к route props автоматически. Вы можете изменить свой Route на следующее и передать реквизит history от Login к LoginCard:

<Route path = "/login" component = {Login} />

Или вы можете использовать withRouter HOC для внедрения route props в компонент LoginCard.

const LoginCard = props => {
  const loginService = new LoginService();

  const handleLogin = () => {
    loginService.login(email, password).then(response => {
      props.history.push("/overview");
    });
  };

  return (
    <div className = "Login">
      <Button onClick = {handleLogin}>Login</Button>
    </div>
  );
};

export default withRouter(LoginCard);

Если вы хотите, чтобы это входило в систему, пожалуйста, также загляните в privateRoute, который поможет вам защитить вашу страницу.

Пожалуйста, посмотрите этот учебник для более подробной информации учебник по авторизации реагировать нажмите здесь

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

if (this.state.authenticated){
 return <Redirect to = {{ pathname: '/overview' }} />
}

и верните свой пользовательский интерфейс для входа, если он не аутентифицирован, как у вас есть

 return (
  <div className = "Login">
  <Button onClick = {handleLogin}>Login</Button>
  </div>
);

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