将通过状态值反应为var不起作用

时间:2019-01-01 22:47:42

标签: reactjs redux state

休息片刻后我一直在做出反应,并尝试将我的状态复制到:

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 :(得分:3)

您应该使用构造器内部的整个状态初始化,而不要使用现已弃用的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)
}

答案 1 :(得分:2)

有几件事可能导致我认为错误。

  1. ComponentDidMount应该使用ComponentInstance.setState方法

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

  1. onLogin方法引用道具而不是状态

    var { email, password } = this.props;
    

    应该是

    var { email, password } = this.state;
    
  2. 与redux的连接似乎令人困惑,因为它将整个状态作为logs属性传递给组件

答案 2 :(得分:0)

在onLogin函数中,您尝试从道具而不是状态中获取电子邮件和密码。