Как правильно сделать толчок? - PullRequest
0 голосов
/ 05 июня 2019

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

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

enter image description here

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

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

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

enter image description here

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.log(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');
    }
  }

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

  handleChangePassword(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.handleChangeUsername(e)} />
              </div>
            </div>
            <div className="password">
              Password:
              <div className="inputPassword">
                <input type="password"
                       value={this.state.password}
                       onChange={e => this.handleChangePassword(e)} />
              </div>
            </div>
            <div className="submitButton">
            <input type="submit" value="Search" />
            </div>
          </form>
        </div>
      </div>
    );
  }
}

1 Ответ

1 голос
/ 05 июня 2019

поместите 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(); в форму, логин будет работать с первой попытки, и реагирующий маршрутизатор перенаправит его на /feed страницу

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...