休息片刻后我一直在做出反应,并尝试将我的状态复制到:
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));
在数据获取状态值之前调用。 我如何强制它等待直到数据设置好?
答案 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)
有几件事可能导致我认为错误。
componentWillMount() {
this.setState({ token: localStorage.getItem('token') })
}
onLogin方法引用道具而不是状态
var { email, password } = this.props;
应该是
var { email, password } = this.state;
与redux的连接似乎令人困惑,因为它将整个状态作为logs属性传递给组件
答案 2 :(得分:0)
在onLogin函数中,您尝试从道具而不是状态中获取电子邮件和密码。