React Redirect не следует использовать за пределами маршрутизатора

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

Uncaught Error: You should not use <Redirect> outside a <Router>

Мои два компонента выглядят так, как показано ниже

App.js

import React, { Component } from 'react';
import axios from 'axios';
import { Route, Redirect } from 'react-router';
import Home from './Home';
import AuthLogin from './AuthLogin';


class App extends Component {

constructor(){
    super();
    this.state = {
      username: '',
      password: '',
      userdata: [],
      isLogin: false
    };

  this.handleUserChange = this.handleUserChange.bind(this);
  this.handleSubmit = this.handleSubmit.bind(this);
}

handleSubmit(event){
    event.preventDefault();
    axios.post('https://api.github.com/user',{}, {
      auth: {
        username: this.state.username,
        password: this.state.password
      }
    }).then((response) => {
      console.info(response.data);
      this.setState({
        userdata: response.data,
        isLogin:true
      });
    }).catch(function(error) {
      console.info('Error on Authentication' + error);
  });
}

handleUserChange(event){
    this.setState({
      username : event.target.value,
    });
}

handlePasswordChange = event => {
  this.setState({
    password: event.target.value
  });
}

render() {
    if (this.state.isLogin){
      return <Redirect to = {{
        pathname: 'home',
        state: this.state.data
      }} />
    }
    return (
      <form onSubmit = {this.handleSubmit}>
        <label>
          username :
          <input type = "text" value = {this.state.username} onChange = {this.handleUserChange} required/>
        </label>
        <label>
          password :
          <input type = "password" value = {this.state.password} onChange = {this.handlePasswordChange} required/>
        </label>
        <input type = "submit" value = "LogIn" />
      </form>

    );
  }
}

export default App;

Home.js

import React, { Component } from 'react';
import axios from 'axios';

class Home extends Component {
    state = {
      Search:'',
      results:[]
    }

  getInfo = () => {

    axios.get('https://api.github.com/search/users',{
    params: {
      q: this.state.Search,
      in:'login',
      type:'Users'
    }
  }).then(({ response }) => {
        this.setState({
          results: response.data.items.login
        })
      })
  }

  handleSearchChange(event){
    this.setState({
      Search: this.state.Search
    }, setInterval(() => {
      if (this.state.Search && this.state.Search.length > 1) {
        if (this.state.Search.length % 2 === 0) {
          this.getInfo();
        }
    }
  },500));

  }

  render(){
  return (
    <div>
      Home page {this.props.data}

    <form>
      <label>
        Search :
        <input type = "text" placeholder = "Search for..." value = {this.state.Search} onChange = {this.handleSearchChange} />
      </label>
   </form>
     </div>
  );
}
}

export default Home;

Моя цель - получить страницу после успешного входа в систему.

Могу я получить помощь? Очень признателен.

Спасибо

Поведение ключевого слова "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) для оценки ваших знаний,...
3
0
9 574
4

Ответы 4

Вместо использования компонента Redirect вы можете использовать

this.props.history.push(<path>)

Если вам нужна помощь по этому поводу, вы можете проверить этот документ -> https://tylermcginnis.com/react-router-programmatically-navigate/

Поскольку ваш компонент находится за пределами области действия маршрутизатора, его параметр истории будет нулевым. Итак, чтобы решить эту проблему, вам нужно передать историю в теге приложения, что-то вроде этого

import history from './history';
<App history = {history}>

Таким образом вы сможете получить доступ к истории внутри вашего класса App. Вам нужно будет создать файл: history.js

import createHashHistory from 'history/createBrowserHistory';

export default createHashHistory();

Я пробовал оба метода в данной ссылке, но все еще получаю проблему ниже в случае history, то есть You should not use <Route> or withRouter() outside a <Router>

rakeeee 04.09.2018 09:08

Вы можете поместить все свое приложение в тег <Router>. Тогда вы не получите эту ошибку.

Sudeep Mukherjee 04.09.2018 13:14

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

Используйте import { browserHistory } from 'react-router';

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

browserHistory.push('/your-route');

Убедитесь, что вы вложили <App/> с <BrowserRouter> в index.js.

ReactDom.render(<BrowserRouter><App/></BrowserRouter>,document.getElementById('root'));

(Использование: import {BrowserRouter} from 'react-router-dom')

Я столкнулся с той же проблемой совсем недавно. На самом деле проблема связана с несколькими версиями response-router-dom, так как в этом случае у вас будет несколько экземпляров response-router, и поэтому будет казаться, что Redirect находится за пределами маршрутизатора. Одна из моих зависимостей заключалась в использовании более старой версии response-router-dom, обновив эту версию, я смог решить проблему.

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