React 19 버전에서 새로운 린트 규칙으로 setState() 호출하기가 신경쓰입니다.
안녕하세요. 요즘 React 19로 다시 강의를 학습하고 있습니다.
그러다 보니 useEffect 내에서 setState() 호출 시 새로운 Lint 규칙으로 react-hooks/set-state-in-effect 대한 경고가 나옵니다. 즉 useEffect 에서 setState() 호출하여 불필요한 추가 렌더링이 발생한다고 경고합니다.
(https://ko.react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect)
아래 pos-editor-modal.tsx 에서도 setContent(""); 에서도 경고가 발생하네요..
useEffect(() => {
if (!isOpen) return;
textareaRef.current?.focus();
setContent(""); // 경고 발생!!
}, [isOpen]);요즘 들어 이런 경고가 신경 쓰이는 데..
왜 이런 규칙이 생겼나요 ?
수정 방법은 아래와 같이 코드를 수정하라 해서 변경했는데 ..startTransition() 을 사용해야 하나요..
useEffect(() => {
if (!isOpen) return;
textareaRef.current?.focus();
startTransition(() => {
setContent('');
});
}, [isOpen]);
回答 2
1
안녕하세요 codingbear님 이정환입니다.
이 경고는 useEffect 안에서 setState를 직접 호출할 때 나타나는 React의 새로운 lint 경고입니다. 작동은 정상적으로 되지만, 성능 이슈나 무한 렌더링을 유발할 가능성이 있어서 경고를 띄워주는 거죠.
만약 경고 메세지를 제거하고 싶으시다면 eslint.config.js 파일에 다음 rules를 추가하시면 됩니다.
"react-hooks/set-state-in-effect": "off",이 경고는 비교적 최근에 추가된 규칙이라, 강의를 촬영할 당시에는 없었거나 덜 엄격했을 수 있습니다.
0
안녕하세요, 인프런 AI 인턴입니다. Codingbear님.
React 19에서의 새로운 Lint 규칙인 react-hooks/set-state-in-effect는 useEffect 내에서 setState()를 호출할 때 발생하는 불필요한 추가 렌더링을 방지하기 위해 도입되었을 가능성이 높습니다. 이 규칙은 성능 최적화를 위해 만들어진 것입니다.
왜 이러한 규칙이 생겼는가?
useEffect에서 setState를 호출할 때 의존성 배열에 포함된 값이 변하면 해당 useEffect가 다시 실행되기 때문에 상태를 변경할 수 있다는 점에서 무한 루프나 불필요한 렌더링이 발생할 수 있습니다.
이를 통해 얻을 수 있는 장점은 의도치 않은 추가적인 렌더링을 방지하고, 컴포넌트 렌더링의 예측 가능성을 높여 성능 최적화에 기여하는 것입니다.
수정 방법
startTransition()을 사용:startTransition은 React가 UI 업데이트를 비차단적(non-blocking)으로 처리할 수 있도록 도와주는 방법입니다.setContent를 비차단적 업데이트로 호출하면, React는 화면 업데이트에 덜 영향을 미치는 방식으로 진행할 수 있습니다.
useEffect(() => {
if (!isOpen) return;
textareaRef.current?.focus();
startTransition(() => {
setContent('');
});
}, [isOpen]);
startTransition을 사용함으로써 UI가 응답성을 높이고 사용자 경험을 개선하는 데 도움이 될 수 있습니다.
관련 질문에 대한 더 많은 정보는 아래 게시물을 통해 살펴보세요:
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
useMutation 적용 후 새로운 글 등록시 content가 안보여요
0
25
2
6.8 zustand 세션 질문입니다.
0
69
2
next.js 강의에서도 리액트 라이브러리들을 다뤄주시나요?
0
57
2
shadcn에서 radix ui와 base ui 차이는 뭔가요?
0
205
2
updateTodo 함수 생성시 화살표 함수 사용 안하는 이유
0
61
2
4.11 바로 투두 삭제가 안됨 질문
0
73
3
매개변수 updatedTodo 관련 질문
0
55
3
인증 정보가 만료되었을 때 라우트 가드 처리가 궁금합니다!
0
72
2
supabase를 사용하지 않을 경우 세션 데이터의 변경을 감지하고 스토어에 보관하는 방법이 궁금합니다!
0
58
2
4.6 id를 string으로 변경시 오류
0
53
2
리액트 타입스크립트 관련 질문있습니다.
0
53
1
소셜 로그인 구현하기 관련하여 질문이 있습니다!
0
87
2
ui 파일 질문드립니다.
0
63
1
tanstack query devtools에서 질문있습니다!
0
56
2
댓글 삭제 시 isPending 질문
0
55
2
두번째 예외상황에 대해 질문있습니다!
0
54
1
리액트 쿼리 질문입니다
0
56
2
개발자도구에서 components 가 안보입니다.
0
78
3
state 관리에 대한 정리
0
69
3
[(2.4) Shadcn/ui를 소개합니다] 강의 Shadcn 세팅 관련 질문 있습니다.
0
147
3
like 테이블에서 왜 create_at이 필요한지 궁금합니다.
0
66
1
삭제가 바로 안되네요ㅠ
0
55
2
access 토큰은 꼭 소셜서버로부터 받아서 사용해야만하나요?!
0
72
2
전역 모달이 여러 개일 경우 모달 프로바이더는 몇 개가 필요한가요?
0
53
1

