我正在尝试使用两个方法,handleChange和handleSubmit作为反应中的登录页面。我试图在状态中为用户名和密码设置两个值,每当修改表单的输入时更新状态值,然后使用状态中存储的值提交。但是,我的值在打印到控制台时返回undefined。 (p.s.我知道我还需要为所有安全专家加密密码)。
我有新的反应,所以我的逻辑可能存在问题:
Login.js
export default class Login extends React.Component {
constructor(props) {
super(props);
this.state = {uname: '', password: ''};
this.handleChange = this.handleChange.bind(this);
this.handleSubmit = this.handleSubmit.bind(this);
}
handleChange(event) {
this.setState({uname: event.target.uname, password: event.target.password});
}
handleSubmit(event) {
alert('A username and password was submitted: ' + this.state.uname + this.state.password);
event.preventDefault();
fetch('https://localhost:8080/login', {
method: 'POST',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json',
},
body: JSON.stringify({
uname: this.state.uname,
password: this.state.password,
})
});
}
render() {
return (
<div>
<Header titleName={"Login"}>
<div className="container">
<div className="card"/>
<div className="card">
<h1 className="title">Login</h1>
<form onSubmit={this.handleSubmit}>
<div className="input-container">
<input name="uname" type="text" value={this.state.uname} id="#uname" required="required"
onChange={this.handleChange}/>
<label form="#unamelabel">Username</label>
<div className="bar"/>
</div>
<div className="input-container">
<input name="password" type="password" value={this.state.password} id="#pass" required="required"
onChange={this.handleChange}/>
<label form="#passlabel">Password</label>
<div className="bar"/>
</div>
<div className="button-container">
<button type="submit" value="Submit"><span>Go</span></button>
</div>
<div className="footer"><a href="#">Forgot your password?</a></div>
</form>
</div>
</div>
</Header>
<Footer/>
</div>
);
}
}
答案 0 :(得分:2)
用此
替换手柄更改handleInputChange(event) {
const target = event.target;
const value = target.value;
const name = target.name;
this.setState({
[name]: value
});
}
您需要将输入值设置为状态,而不是输入的名称
答案 1 :(得分:1)
如果要获取反应有状态组件内输入的值,则应设置此输入的ref属性,如下所示:
<input name="username" ref={node => this.username = node} />
然后调用this.username将返回用户名输入的实际值。
您不希望在提交操作中设置状态,因为这会使您的组件每次都会在字母推送输入值时重新呈现。
中的更多内容答案 2 :(得分:1)
问题在于handleChange函数。在上面发布的代码中,有两个不同的事件&#39;与两个表单输入关联的对象。他们每个人都有自己的一套属性。例如:&#39; event.target.name&#39;存储&#39;名称&#39;由&#39;输入&#39;指定的属性标记为&#39; event.target.value&#39;存储用户输入的数据。因此,将handleChange的实现更改为
(A)详细
handleChange(event) {
if (event.target.name == "uname") {
this.setState({
uname: event.target.value
});
}
if (event.target.name == "password") {
this.setState({
password: event.target.value
});
}
}
您可以在其中匹配&#39;名称&#39;属于uname或password并相应地设置状态。
(B)简洁
handleChange(event) {
this.setState({
[event.target.name]: event.target.value
});
}
答案 3 :(得分:0)
我认为handleChange应该setState应该有event.tagert.name = event.target.value:
handleChange(evt) {
this.setState({
[evt.target.name]: evt.target.value,
});
}