У вашей реализации есть некоторые проблемы.
Проблемы
В каждом handleChange()
this.state
есть НЕ , содержащее значения, содержащие значения ОБНОВЛЕНО .e.target.value
содержит обновленный текст, поэтому используйте его.
Кроме того, вы используете одну переменную состояния, чтобы указать, является ли форма действительной или нет.Это не удастся, потому что если пользователь введет правильное имя пользователя, а остальные будут пустыми, вы все равно получите действительную форму.Это неправильно.
Кроме того, написание функции для каждого текстового поля является трудной задачей.
Предложения
Используйте одну функцию для обработки изменений пользовательского ввода.Используйте атрибут name
, предоставленный вами для элементов <input>
.
Используйте состояние допустимости для каждого поля.Затем разрешите отправку, если все действительны.
Посмотрите на это решение
Решение
import React, { Component } from 'react';
class App extends Component {
constructor(props) {
super(props)
this.state = {
username: '',
username_valid: false,
email: '',
email_valid: false,
password: '',
password_valid: false,
confirm_password: '',
confirm_password_valid: false,
errorMessage: ''
}
this.handleChange = this.handleChange.bind(this);
this.handleSubmit = this.handleSubmit.bind(this);
}
handleChange(e) {
const field = e.target.name;
const value = e.target.value.trim();
let errMsg = '';
switch (field) {
case 'username':
errMsg = value.length < 6 ? 'Username must be 6 char or more' : '';
break;
case 'email':
errMsg = value.length < 1 ? 'Please fill up email' : '';
break;
case 'password':
if (value.length < 8) {
errMsg = 'Password must be 8 char or more';
} else {
let test = (/[a-z]/.test(value) ? true : false)
&& (/[A-Z]/.test(value) ? true : false)
&& (/\d/.test(value) ? true : false);
errMsg = test ? '' : 'Password must contain a lowercase, an auppercase and a digit';
}
if (value === this.state.confirm_password) {
this.setState({ confirm_password_valid: true });
} else {
this.setState({ confirm_password_valid: false });
}
break;
case 'confirm_password':
errMsg = value !== this.state.password ? 'Both passwords must match' : '';
break;
default:
}
this.setState({
[field]: value,
[field + '_valid']: errMsg === '' ? true : false,
errorMessage: errMsg
})
}
handleSubmit(e) {
e.preventDefault();
const { username_valid, email_valid, password_valid, confirm_password_valid } = this.state;
if (username_valid && email_valid && password_valid && confirm_password_valid) {
alert("Form submitted!");
}
console.log(username_valid, email_valid, password_valid, confirm_password_valid);
}
render() {
const { username, email, password, confirm_password } = this.state;
return (
<div className="App">
<form onSubmit={this.handleSubmit}>
<input type="text" name="username" placeholder="username" value={username} autoComplete="off" onChange={this.handleChange} /><br />
<input type="email" name="email" placeholder="you@example.com" value={email} autoComplete="off" onChange={this.handleChange} /><br />
<input type="password" name="password" placeholder="password" value={password} autoComplete="off" onChange={this.handleChange} /><br />
<input type="password" name="confirm_password" placeholder="password" value={confirm_password} autoComplete="off" onChange={this.handleChange} /><br />
<button type="submit">Submit</button><br />
<label>{this.state.errorMessage}</label>
</form>
</div>
);
}
}
export default App;
ПРИМЕЧАНИЕ : Если ваша форма очень проста, вы можете просто использовать неконтролируемые входы .Просто Google Неконтролируемые входы в реакции вы найдете.
ПРИМЕЧАНИЕ : Если вы новичок в любом из этих синтаксисов, попробуйте поискать ES6 функции .Одним из них является * разрушение объекта.Я предполагаю, что у вас не возникнет проблем с синтаксисом.