Реагируйте значения проходного состояния, чтобы var не работал - PullRequest
0 голосов
/ 02 января 2019

Я возвращаюсь, чтобы отреагировать после некоторого перерыва и пытаюсь скопировать меня в состояние:

var {email, password } = this.state;

По какой-то причине я получил ошибку:

ReferenceError: парольне определено в eval (eval в ...

Не могу понять это, у меня такая ошибка на простом материале. Работа над версией:

"react": "^16.7.0",

Имне код:

import React, { Component } from 'react';
import { connect } from "react-redux";
import { HashRouter, Route } from 'react-router-dom';
import { login } from '../actions/loginActions';

class Login extends Component {
  constructor (props) {
    super(props)
    this.state = {
      email: "",
      password: "",
      token: "",
      redirect: false

    };

    this.onLogin = this.onLogin.bind(this)
    this.onLogout = this.onLogout.bind(this)
  }
  handleUpdateEmail = (e) =>{
    console.log('handleUpdateEmail: '+e.target.value)
    this.setState({email: e.target.value});

  }
  handleUpdatePassword = (e) =>{
    console.log('handleUpdatePassword: '+e.target.value)
    this.setState({password: e.target.value});
  }
  componentWillMount() {
    this.state =  { token: localStorage.getItem('token') }
  }

  onLogin = () => {

    var { email, password } = this.state;
    let data = {
      'email': email,
      'password': password    
    }
    this.props.dispatch(login(data));
  }

  onLogout = state =>{
    localStorage.removeItem('token');
  }
  render() {
    const { redirect } = this.state;
    if (redirect) {
      return (
        <HashRouter>
        <Route path='/' component={() => window.location = '/'}/>
        </HashRouter>
      );
    }
    return (
      <div className="app flex-row align-items-center">
      <form onSubmit={this.onLogin} >
        <label>
        Username:
        <input type="text" placeholder="Username" onChange={this.handleUpdateEmail}/>

        </label>
        <label>
        Password:
        <input type="password" placeholder="Password" onChange={this.handleUpdatePassword} />

        </label>
        <input type="submit" value="Submit" />
        </form>
      </div>
    );
  }
}
const mapStateToProps = state => ({
    logs: state

  });
  export default connect(mapStateToProps)(Login);

Как мне подойти к такой ошибке? И, вероятно, как решить эту проблему?

- РЕДАКТИРОВАТЬ - После того, как мои друзья ниже помогают мне, я понимаю, чтопроблема в том, что функция

    this.props.dispatch(login(data));

вызывает до того, как данные получают значения состояния. Как я могу заставить ее ждать, пока данные не будут установлены?

Ответы [ 3 ]

0 голосов
/ 02 января 2019

По моему мнению, есть несколько вещей, которые могут привести к ошибке.

  1. ComponentDidMount должен использовать метод ComponentInstance.setState

componentWillMount() {
  this.setState({ token: localStorage.getItem('token') })
}

Метод onLogin ссылается на реквизит, а не на состояние

var { email, password } = this.props;

должно быть

var { email, password } = this.state;

Соединение с redux кажется запутанным, посколькупередает все состояние как свойство logs компоненту

0 голосов
/ 02 января 2019

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

 constructor (props) {
   super(props)
   this.state = {
     email: "",
     password: "",
     redirect: false,
     token: localStorage.getItem('token')
   };

   this.onLogin = this.onLogin.bind(this)
   this.onLogout = this.onLogout.bind(this)
}
0 голосов
/ 02 января 2019

В функции onLogin вы пытаетесь получить адрес электронной почты и пароль от реквизита вместо состояния.

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