我有一個簡單的登錄表單,它接收用戶電子郵件和用戶密碼,目標是在輸入欄位下直接彈出錯誤訊息,并僅在輸入為空或模式錯誤時在輸入周圍添加紅色邊框. 只有我的輸入欄位之一運行正常。(輸入欄位似乎相互依賴?)任何幫助將不勝感激!
一旦密碼滿足要求,另一個輸入欄位將移除紅色邊框,但錯誤訊息仍然存在。目標是同時移除紅色邊框和錯誤訊息
class Login extends Component {
constructor(props) {
super(props);
this.emailInput = React.createRef();
this.passwordInput = React.createRef();
this.state = {
email: "",
password: "",
emailError: false,
passwordError: false,
};
this.handleSubmit = this.handleSubmit.bind(this);
this.handleInputChange = this.handleInputChange.bind(this);
this.validate = this.validate.bind(this);
}
handleInputChange(e) {
const { value, name } = e.target;
this.setState({ [name]: value });
console.log(value);
}
validateEmail(userEmail) {
const emailPattern = /^[a-zA-Z0-9._-] @[a-zA-Z0-9.-] \.[a-zA-Z]{2,4}$/;
return emailPattern.test(userEmail);
}
validatePassword(userPassword) {
const passwordPattern =
/^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[!@#$%^&*])(?=.{8,})/;
return passwordPattern.test(userPassword);
}
styleBorderEmail(emailInput, styles) {
this.emailInput.current.style.border = styles;
}
styleBorderPassword(passwordInput, styles) {
this.passwordInput.current.style.border = styles;
}
validate() {
let emailError = this.email;
let passwordError = this.password;
if (!this.validateEmail(this.state.email)) {
emailError = "email not valid";
this.styleBorderEmail(this.emailInput, "1px solid red");
} else {
this.styleBorderEmail(this.emailInput, "1px solid black");
}
if (!this.validatePassword(this.state.password)) {
passwordError = "password not valid";
this.styleBorderPassword(this.passwordInput, "1px solid red");
} else {
this.styleBorderPassword(this.passwordInput, "1px solid black");
}
if (emailError || passwordError) {
this.setState({ emailError, passwordError });
return false;
}
return true;
}
handleSubmit(e) {
e.preventDefault();
const isValid = this.validate();
if (isValid) {
alert("successful submit");
// clears the form after it's been submitted
this.setState({
email: "",
password: "",
emailError: false,
passwordError: false,
});
}
}
render() {
return (
<div className="login-component">
<div className="login-container">
<h2>Welcome Back!</h2>
<br />
<form onSubmit={this.handleSubmit}>
<div className="login-group">
<label htmlFor="email" className="login-label">
Your email
</label>
<input
className="login-input"
type="text"
name="email"
id="email"
placeholder="Enter your email"
value={this.state.email}
onChange={this.handleInputChange}
onKeyUp={this.validate}
ref={this.emailInput}
/>
{this.state.emailError && (
<span className="error-login">
Please enter a valid email address
</span>
)}
</div>
<div className="login-group">
<label htmlFor="password" className="login-label">
Password
</label>
<input
className="login-input"
type="password"
name="password"
id="password"
placeholder="Enter your password"
value={this.state.password}
onChange={this.handleInputChange}
onKeyUp={this.validate}
ref={this.passwordInput}
/>
{this.state.passwordError && (
<span className="error-login">Please enter a password</span>
)}
</div>
<div>
<button type="submit" className="login-btn">
Login
</button>
</div>
</form>
</div>
</div>
);
}
}
export default Login;
uj5u.com熱心網友回復:
this.setState({ emailError: "", passwordError: "" });在回傳true之前,您需要在validate函式中添加一行代碼。
新的驗證功能如下所示
validate() {
let emailError = this.email;
let passwordError = this.password;
if (!this.validateEmail(this.state.email)) {
emailError = "email not valid";
this.styleBorderEmail(this.emailInput, "1px solid red");
} else {
this.styleBorderEmail(this.emailInput, "1px solid black");
}
if (!this.validatePassword(this.state.password)) {
passwordError = "password not valid";
this.styleBorderPassword(this.passwordInput, "1px solid red");
} else {
this.styleBorderPassword(this.passwordInput, "1px solid black");
}
if (emailError || passwordError) {
this.setState({ emailError, passwordError });
return false;
}
this.setState({ emailError: "", passwordError: "" }); // New line added
return true;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/393752.html
標籤:javascript 反应 验证 输入 用户输入
上一篇:使用模式驗證客戶端資料輸入
