Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- jQuery
- 백준
- JavaScript
- 배열 중복 제거
- 카테고리필터
- 배열 메소드
- 클라이언트 컴포넌트
- 항해99
- 그리디
- 로딩 후 실행
- 서버 컴포넌트
- 날씨 api
- 동전 0
- 프로그래머스
- 항해99후기
- 항해99추천
- 중복카테고리
- 알고리즘
- 부트캠프항해
- server component
- greedy
- 실전프로젝트
- 항해99솔직후기
- NextJS v13
- 중복선택
- 자바스크립트
- 숫자를 별점으로
- db수정
- react
- 탐욕알고리즘
Archives
- Today
- Total
공부 및 일상기록
[React] useState 한 박자 느리게 찍히는 문제 (비동기) 본문
이번 주차에 클론코딩을 진행하게 되었는데 오늘은 회원가입 페이지를 만들게 되었다.
아이디 및 비밀번호에 정규식도 넣고 나름 요즘 인터넷 회원가입처럼 만들고 싶었다.
그래서 아이디 비밀번호 등 모든 조건이 부합해야만 로그인 버튼이 활성화 되도록 삼항 연산자를 만들었다.
삼항 연산자에는 모든 조건이 부합한다면 이라는 조건을 넣었다.
그 모든 조건이 부합하면 이라는 판별은 onChange로 이벤트 발생시 조건이 맞다면 true가 되는 형식이였다.
그런데 조건이 부합하여도 한박자 느리게 판별식이 true로 바뀌는 현상이 있었다.
인터넷을 찾아보니 문제는 useState의 비동기 처리로 인한 문제였다.
이를 해결 하기 위해선 useEffect를 사용하여 state가 변할 때 마다 함수가 실행되도록 해야만 했다.
기존 코드를 살펴보자
const onChangeUserHandler = (e) => {
const { name, value } = e.target;
setUser({ ...user, [name]: value });
if (name === "email") {
!regEmail.test(value)
? setEmailInput("이메일 형식으로 입력해 주세요!")
: setEmailInput("good");
}
if (name === "password") {
!regPassword.test(value)
? setPassInput(`8~16자의 영문 대소문자와 숫자로 입력해주세요.
특수문자(!@#$%^&*)도 사용 가능합니다.`)
: setPassInput("good");
}
if (name === "nickname") {
!regNickname.test(value)
? setNicknameInput("닉네임은 2-6자의 한글만 입력 가능합니다.")
: setNicknameInput("good");
}
if (name === "passwordCheck") {
password !== value
? setPassCheckInput("비밀번호가 불일치 합니다.")
: setPassCheckInput("good");
}
console.log(registerOk);
if (
regEmail.test(email) &&
regPassword.test(password) &&
regNickname.test(nickname) &&
password === passwordCheck
) {
return setRegisterOk(true);
} else {
return setRegisterOk(false);
}
};
//여기서 setRegister가 true에서 false로 바뀔때나 false에서 true로 바뀌는게 한박자 느렸다.
위 코드의 마지막 주석처럼 한박자 느린 현상이 발생하였다.
그럼 다음으로 수정된 코드를 보자.
useEffect(() => {
if (
regEmail.test(email) &&
regPassword.test(password) &&
regNickname.test(nickname) &&
password === passwordCheck
) {
return setRegisterOk(true);
} else {
return setRegisterOk(false);
}
}, [user]);
//기존 코드에서 if문을 onChangeHandler함수에서 빼내고 useEffect안으로 넣었다.
기존 코드에서 판별조건문을 밖으로 빼내고 useEffect 훅에 넣고 dependency로 user스테이트를 넣어 즉각적으로 반응하도록 수정하였다.
이걸 보면서 내가 기초가 많이 부족하다는걸 새삼 또 알게되었고, 비동기처리에 대한 무지함이 아직도 많다는 것을 느꼈다.
'개발 > React' 카테고리의 다른 글
[React] 리액트 경로 이동시 스크롤 상단 이동 방법 (0) | 2022.12.14 |
---|---|
[React] 중복 선택 가능한 카테고리 필터 만들기 (0) | 2022.11.13 |
[React] 새로고침 시에도 리덕스 내부의 데이터를 유지하는 방법 (0) | 2022.10.13 |
[React] form 내부의 submit 사용시 리덕스 데이터 초기화 원인 (0) | 2022.10.13 |
[React] 옵셔널 체이닝 이란 무엇일까? (1) | 2022.10.11 |