Created
October 23, 2021 11:43
-
-
Save aidiary/fdef22139e92e5e45eac62ec468f8fba to your computer and use it in GitHub Desktop.
useEffectで入力のバリデーション
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import React, { useEffect, useState } from 'react'; | |
import Button from '../UI/Button/Button'; | |
import Card from '../UI/Card/Card'; | |
import classes from './Login.module.css'; | |
const Login = (props) => { | |
const [enteredEmail, setEnteredEmail] = useState(''); | |
const [emailIsValid, setEmailIsValid] = useState(); | |
const [enteredPassword, setEnteredPassword] = useState(''); | |
const [passwordIsValid, setPasswordIsValid] = useState(); | |
const [formIsValid, setFormIsValid] = useState(false); | |
// enteredEmailとenteredPasswordが更新されるたびにsetFormIsValid()が副作用として呼ばれる | |
useEffect(() => { | |
setFormIsValid( | |
enteredEmail.includes('@') && enteredPassword.trim().length > 6 | |
); | |
}, [enteredEmail, enteredPassword]); | |
const emailChangeHandler = (event) => { | |
setEnteredEmail(event.target.value); | |
}; | |
const passwordChangeHandler = (event) => { | |
setEnteredPassword(event.target.value); | |
}; | |
const validateEmailHandler = () => { | |
setEmailIsValid(enteredEmail.includes('@')); | |
}; | |
const validatePasswordHandler = () => { | |
setPasswordIsValid(enteredPassword.trim().length > 6); | |
}; | |
const submitHandler = (event) => { | |
event.preventDefault(); | |
props.onLogin(enteredEmail, enteredPassword); | |
}; | |
return ( | |
<Card className={classes.login}> | |
<form onSubmit={submitHandler}> | |
<div | |
className={`${classes.control} ${ | |
emailIsValid === false ? classes.invalid : '' | |
}`} | |
> | |
<label htmlFor='email'>E-Mail</label> | |
<input | |
type='email' | |
id='email' | |
value={enteredEmail} | |
onChange={emailChangeHandler} | |
onBlur={validateEmailHandler} | |
/> | |
</div> | |
<div | |
className={`${classes.control} ${ | |
passwordIsValid === false ? classes.invalid : '' | |
}`} | |
> | |
<label htmlFor='password'>Password</label> | |
<input | |
type='password' | |
id='password' | |
value={enteredPassword} | |
onChange={passwordChangeHandler} | |
onBlur={validatePasswordHandler} | |
/> | |
</div> | |
<div className={classes.actions}> | |
<Button type='submit' className={classes.btn} disabled={!formIsValid}> | |
Login | |
</Button> | |
</div> | |
</form> | |
</Card> | |
); | |
}; | |
export default Login; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment