inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

React 완벽 마스터: 기초 개념부터 린캔버스 프로젝트까지

렌더링 단계 이해하기 (with 리렌더링)

Counter 컴포넌트 전부 리렌더링 되는 현상

132

rookiezin

작성한 질문수 1

0

<Counter onTotal={handleTotal} />

<hr/>

<Counter onTotal={handleTotal}/>

<hr/>

<Counter onTotal={handleTotal}/>

여기서 Counter.jsx에서 console.log 를 추가했고

버튼 세 개 중 하나만 눌러도 <Counter /> 세 개 전체가 리렌더링 됩니다. (log 가 세번찍힘)

왜그런건가요 ?

react React-Context react-router tailwindcss react-query

답변 2

0

짐코딩

안녕하세요 🙂

부모 컴포넌트에 리렌더링이 발생한거같아요.

React에서 부모 컴포넌트가 리렌더링되면 기본적으로 자식 컴포넌트들도 리렌더링됩니다.

리렌더링 관련해서 "성능 최적화"섹션을 수강하시면 궁금하신 사항을 해소할 수 있을거예요~!

0

인프런 AI 인턴

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

React에서 부모 컴포넌트가 리렌더링되면 기본적으로 자식 컴포넌트들도 리렌더링됩니다. 이는 React의 기본 동작 방식입니다. 질문하신 상황에서는 Counter 컴포넌트의 onTotal prop에 전달된 handleTotal 함수가 Counter 컴포넌트가 리렌더링되도록 하는 원인이 될 수 있습니다.

Counter 컴포넌트에서 console.log가 세 번 찍히는 이유는 onTotal 함수가 변경되지 않는 한 Counter 컴포넌트가 리렌더링될 일이 없으므로, onTotal 함수의 참조가 변경될 가능성을 확인해야 합니다. 렌더링될 때마다 부모 컴포넌트에서 이 함수가 재생성되어 동일한 함수처럼 보여야 하지만, React는 이 함수의 새로운 참조를 인식하게 됩니다.

이를 해결하기 위해 useCallback 훅을 사용할 수 있습니다. useCallback을 사용하면 함수의 참조가 변경되지 않도록 만들어 줄 수 있습니다. 아래와 같이 구현할 수 있습니다:

import React, { useCallback } from 'react';

const ParentComponent = () => {
  const handleTotal = useCallback(() => {
    console.log('total handled');
  }, []);

  return (
    <>
      <Counter onTotal={handleTotal} />
      <Counter onTotal={handleTotal} />
      <Counter onTotal={handleTotal} />
    </>
  );
}

이렇게 하면 handleTotal 함수의 참조가 동일하게 유지되기 때문에 Counter 컴포넌트가 불필요하게 리렌더링되지 않게 됩니다.

이에 대해 더 깊이 있는 내용이 궁금하시다면 다음 링크를 참고해 보세요:
- React에서의 컴포넌트 리렌더링 최적화 방법

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

오타?

0

27

1

뭐하나 여쭤봐도 될까요?

0

70

1

안녕하세요 질문이 있습니다.

0

55

2

질문 : 삭제 버튼 아규먼트 (id)

0

50

1

Tailwind 버전 확인

0

62

1

align-items 정렬

0

50

2

vite 명령어로 프로젝트를 만들었습니다. (vscode)

0

79

1

31. 객체 업데이트 하기 - 10:15 질문

1

55

2

강의교안, 내용 인용해서 블로그 글 작성

1

80

2

이미지가 출력되지 않아요

1

73

2

강의와 만들어진 코드가 달라요

0

76

3

AI와 CSS 라이브러리의 궁합

0

95

1

onClick 이벤트에 함수 넘길 때

0

64

1

린캔버스 기능 구현은 왜 못하나요.... 구현하고 싶습니다...

0

101

1

notes 없음 읽기 오류

0

72

1

Object.assign 문법

0

64

1

react-router 전혀 기능 안함

0

53

1

react-router-dom@6.25.1

0

47

1

React Router 최신 스펙

0

207

1

Immer 에서 filter, map 사용

0

54

1

vite 설치에 대해 질문있습니다.

0

76

2

라이브러리 버전 일치 이슈

0

76

1

"Enter 키 발생 시 항목 추가" 부분에서 공백이 포함되면 한 줄이 더 입력됩니다

0

49

2

TotalCounter을 작성할때

0

65

2