inflearn logo
강의

講義

知識共有

一口サイズで切って食べるReact.js実践プロジェクト - SNS編

(7.1) 投稿追加UIを実装する

React 19 버전에서 새로운 린트 규칙으로 setState() 호출하기가 신경쓰입니다.

解決済みの質問

142

Codingbear

投稿した質問数 18

0

안녕하세요. 요즘 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]);

 

react typescript react-query supabase zustand 지금-베스트

回答 2

1

winterlood

안녕하세요 codingbear님 이정환입니다.

이 경고는 useEffect 안에서 setState를 직접 호출할 때 나타나는 React의 새로운 lint 경고입니다. 작동은 정상적으로 되지만, 성능 이슈나 무한 렌더링을 유발할 가능성이 있어서 경고를 띄워주는 거죠.

만약 경고 메세지를 제거하고 싶으시다면 eslint.config.js 파일에 다음 rules를 추가하시면 됩니다.

      "react-hooks/set-state-in-effect": "off",

이 경고는 비교적 최근에 추가된 규칙이라, 강의를 촬영할 당시에는 없었거나 덜 엄격했을 수 있습니다.

0

communityai8509

안녕하세요, 인프런 AI 인턴입니다. Codingbear님.

React 19에서의 새로운 Lint 규칙인 react-hooks/set-state-in-effectuseEffect 내에서 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