
1. ID, PW의 상태값 같이 관리하기
❌수정 전
const [idValue, setIdValue] = useState('');
const [pwValue, setPwValue] = useState('');
function saveUserId(event) {
setIdValue(event.target.value);
}
function saveUserPw(event) {
setPwValue(event.target.value);
}
⭕수정 후
const [userInfo, setUserInfo] = useState({
id: '',
pw: '',
});
const handleInput = e => {
const { name, value } = e.target;
setUserInfo(prev => {
return { ...prev, [name]: value };
});
};
📌 알게된 점
- useState가 많을수록 UI가 변할때마다 랜더링되기 때문에 가급적 줄이는 것이 좋다.
- 계산된 속성명을 이용한다면 아이디와 비밀번호의 inputValue값을 함께 관리할 수 있다.
- 또한 set함수 안에서 prev를 매개변수 인자로 콜백함수를 쓰면 set함수가 알아서 useState의 상태값을 가져온다.
- inputValue는 지극히 개발자만 알아보기 쉬운 변수명이다. 이름을 지을 때 어떤 동작을 하는지 알 수 있도록 지어주면 좋다. (예를 들면 idValue와 pwValue 대신 userInfo)
2. 조건에서 이미 true/false값을 나타낸다면 바로 이용하자
❌수정 전
const [btnDisable, setBtnDisable] = useState(true);
const [isActive, setIsActive] = useState(false);
const validationTest = () => {
if (idValue.includes('@') && pwValue.length > 5) {
if (inputValue.id.includes('@') && inputValue.pw.length > 5) {
setIsActive(true);
setBtnDisable(false);
} else {
setIsActive(false);
setBtnDisable(true);
}
};
<button
disabled={btnDisable}
onClick={goToMain}
type="button"
className={isActive ? 'btnActive' : btnUnactive'}
>
로그인
</button>
⭕수정 후
const isValid = userInfo.id.includes('@') && userInfo.pw.length > 5;
<button
disabled={!isValid}
onClick={goToMain}
type="button"
className={isValid ? 'btnActive' : 'btnUnactive'}
>
로그인
</button>
📌 알게된 점
- 아이디와 비밀번호 유효성 검사해주는 함수를 만들면 코드의 가독성도 좋아지고 기능이 분리화되서 좋다고 생각했다.
- 하지만 코드 자체에서 이미 true와 false를 반환해준다면 이를 바로 이용하는 것이 좋다.
- 함수를 위해 만들었던 useState도 2개나 지울 수 있어 불필요한 랜더링 횟수를 줄일 수가 있다.
- 버튼의 disabled, className에서도 isValid의 true/false 값만 이용해서 표현할 수 있다.
- 단 disable은 true 일 때가 버튼이 비활성화되므로 !(부정연산자)를 사용하여 반대로 표현해주면 된다.