• 카테고리

    질문 & 답변
  • 세부 분야

    풀스택

  • 해결 여부

    미해결

onChangePasswordCheck [password] 인자 문의

23.08.15 22:12 작성 조회수 209

0

안녕하세요 zerocho 님
아래 코드에서

const onChangePasswordCheck = useCallback(
	(e) => {
		console.log("onChangePasswordCheck1 :" + e.target.value);
		console.log("onChangePasswordCheck2:" + passwordCheck);  //전 값을 참조함

		setPasswordError(e.target.value !== password);
		setPasswordCheck(e.target.value);
	},
	[password] //passwordCheck 로 바꾸어도 전 값을 참조함
);

 

1.[password] 부분을 [] 바꾸어도 정상 작동 하는 것 같구요

[] 의미는 최초 render 시에만 함수를 생성한다는 의미로 알고 있습니다만...

2.[passwordCheck]로 바꾸면...

[웹 게임을 만들며 배우는 React/6-5. useMemo와 useCallback] 강의에 의하면

onChangePasswordCheck 안에서 passwordCheck 가 정상 참조 되어야 할 것 같은데..

이전 값으로 참조 되는 것 같습니다.

2번째 인자 작동 방식이 정확히 이해 되지 않습니다.

다시 한번 설명 부탁 드려도 될까요?

(참고자료나, zerocho님, 다른 강의 부분 알려 주시면 직접 찾아 보겠습니다.)

감사합니다.

답변 1

답변을 작성해보세요.

1

[password]를 []로 바꾸면 password가 함수 내부에서 안 바뀝니다. [passwordCheck]로 바꾸면 passwordCheck는 바뀌어도 password가 안 바뀌겠죠.

이전 값으로 참조된다는 걸 어떻게 확인하셨나요? 저는 아무리 시도해봐도 제 설명 그대로 나옵니다.

osakapark님의 프로필

osakapark

질문자

2023.08.16

안녕하세요 zerocho 님, 답변 감사드립니다.

1.[password] 로 하였을 때는 문제가 없습니다.

zerocho님 말씀 대로 []이면, password를 갱신하지 못하네요...

zerocho said "useCallback은 너무 기억력이 좋아서, useState의 경우 의존성 배열에 넣지 않으면 평생 기억한다" (맞나요? ㅎㅎ)

 

2.그런데... 아래와 같이

passwordCheck 로 하였을 때는, onChangePasswordCheck2, onChangePasswordCheck3 에서는 항상 직전 값을 출력합니다. (갱신은 되나 직전 값으로)

onChangePasswordCheck2 는 setPasswordCheck 호출 전이라 직전값을 출력하는 것은 이해가 되는데..

onChangePasswordCheck3 도 직적값을 출력하는 이유는.. setPasswordCheck 이 비동기 작업을 한다는 의미인지요?

 

const onChangePasswordCheck = useCallback((e) => { 
	console.log('onChangePasswordCheck1 :' + e.target.value);   // 입력값 정상 출력   
	console.log('onChangePasswordCheck2 :' + passwordCheck);    // 직전 값 출력
	setPasswordError(e.target.value !== password);
	setPasswordCheck(e.target.value);
	console.log('onChangePasswordCheck3 :' + passwordCheck);    // 여전히(?) 직전 값 출력
}, [passwordCheck]);

네 set 함수들은 바로 값을 갱신하지 않습니다. 즉 set을 하고 다음줄이 되어도 여전히 이전 값입니다. 리렌더링 후에만 갱신됩니다.