Как правильно сделать толчок?

Я делаю страницу входа в реакцию. Когда вход завершен, мой ответ должен перенаправить на мою страницу FrontFeed. Я использую this.props.history.push('/feed');, чтобы нажать на страницу, но когда я захожу на страницу входа и ввожу свои учетные данные, логин перенаправляется на логин с другим URL-адресом, и мне нужно снова войти в систему, и только во второй раз логин перенаправляется на FrontFeed.

Когда я захожу на страницу в первый раз

Как правильно сделать толчок?

Я вошел в систему (учетные данные верны), и страница перенаправляется на ту же страницу, но с другим URL /#/ -> /?#/. Функции не вызываются, потому что заявки не сделаны, а локальное хранилище ничего не сохраняет.

Но при втором входе все работает нормально, заявки оформляются и локальное хранилище сохраняется, а моя страница перенаправляется на http://localhost:3000/?#/feed.

Я не уверен, правильно ли я использую react-router-dom. Но что-то не так.

Как правильно сделать толчок?

import React from 'react';
import './css/App.css';

import MainPage from './pages/MainPage.js';

function App() {

  return (
    <MainPage/>
  );
}

export default App;

import React, { Component } from 'react';
import '../css/MainPage.css';
import FrontFeed from './FrontFeed.js';
import Login from './Login.js';

import {
  Route,
  NavLink,
  HashRouter
} from "react-router-dom";

export default class MainPage extends Component{

  componentDidMount() {
    var token = localStorage.getItem('Token');
    console.info(token);
  }

  render () {
    return (
      <HashRouter>
        <div className = "app">
            <div className = "content">
              <Route exact path = "/" component = {Login}/>
              <Route path = "/feed" component = {FrontFeed}/>
            </div>
        </div>
      </HashRouter>
    );
  }
}

import React, { Component } from 'react';
import '../css/Login.css';
import UserService from '../services/UserService'
import {ToastsContainer, ToastsContainerPosition, ToastsStore} from 'react-toasts';

export default class Login extends Component {

  constructor(props) {

    super(props);

    this.state = {
      user: new UserService(),
      password: '',
      username: '',
    }
  }

  componentDidMount() {
    var token = localStorage.getItem('Token');
    if (token) {
      this.props.history.push('/feed');
    }
  }

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

  handleChangeEventPassword(event) {
    this.setState({password: event.target.value});
  }

  handleSubmit(event) {
    this.state.user.login(this.state.username, this.state.password).then(res => {
      if (res.data.super) {
        localStorage.setItem('Token', res.data.key);
        ToastsStore.success('Login Sucess!');
      } else {
        ToastsStore.success("You aren't super!");
      }
      this.props.history.push('/feed');
    }).catch(err => {
      ToastsStore.success('Login Failed');
    })
  }

  render() {
    return (
      <div className = "loginContent">
        <ToastsContainer position = {ToastsContainerPosition.BOTTOM_CENTER}
                         store = {ToastsStore}/>
        <div className = "title">Login to ADM</div>
        <div className = "credentialsContainer">
          <form onSubmit = {e => this.handleSubmit(e)}>
            <div className = "username">
              Username:
              <div className = "inputUsername">
                <input type = "text"
                       value = {this.state.username}
                       onChange = {e => this.handleChangeEventUsername(e)} />
              </div>
            </div>
            <div className = "password">
              Password:
              <div className = "inputPassword">
                <input type = "password"
                       value = {this.state.password}
                       onChange = {e => this.handleChangeEventPassword(e)} />
              </div>
            </div>
            <div className = "submitButton">
            <input type = "submit" value = "Search" />
            </div>
          </form>
        </div>
      </div>
    );
  }
}
Поведение ключевого слова "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) для оценки ваших знаний,...
0
0
89
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

поместите event.preventDefault(); внутри функции handleSubmit, это предотвратит перезагрузку страницы, поэтому ваши функции не выполняются с первого раза

типичная форма будет отправлять данные в действие с помощью метода

<form action = "/action_page.php" method = "post">

но поскольку вы используете handleSubmit(), а не действие, данные будут отправляться в никуда (подробнее о формах можно прочитать здесь https://www.w3schools.com/html/html_forms.asp )

когда вы отправляете в первый раз, вы увидите в URL-адресе входные значения, которые у вас есть в форме (если вы поместите на них имена), но, поскольку вы не указали на них имена в своей форме, поэтому вы их не видите в URL-адресе (если исходить из кода, который вы указали выше)

event.preventDefault() предотвращает обычную отправку формы и перезагрузку страницы, чтобы вы могли выполнять функции внутри нее (то же самое я сделал с проектом, над которым работал)

после того, как вы поместите event.preventDefault(); в форму, логин сработает с первой попытки и react router перенаправит его на страницу /feed

надеюсь мой ответ немного помог

Я понимаю свою ошибку, я видел страницу формы на сайте реагирования, и там есть это event.preventDefault();, но я думаю, что в какой-то момент стираю код. теперь я понимаю, как это использовать. Спасибо.

Vinicius Morais 05.06.2019 20:43

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