강의

멘토링

로드맵

Inflearn brand logo image

인프런 커뮤니티 질문&답변

유일용님의 프로필 이미지
유일용

작성한 질문수

한 입 크기로 잘라 먹는 리액트(React.js) : 기초부터 실전까지

10.3) React.memo와 컴포넌트 렌더링 최적화

React.memo 컴포넌트 렌더링 최적화 미션 day16 질문

해결된 질문

작성

·

58

0

안녕하세요. 강사님.

react day 16 미션 contactEditor onChange 이벤트 발생 관련 렌더링 질문이 있습니다.

아래와 같이 ContactList에도 React.memo 내장함수를 적용했음에도 불구하고 contactEditor에서 텍스트를 입력하면 같이 렌더링 되는 이유를 모르겠습니다.

const ContactList = ({contacts, onDelete}) => {
    return (
        <div className="ContactList">
        <div className="title">Contact List</div>
        {contacts.map((contact) => {
            return <ContactItem 
            key={contact.id} 
            contact={contact}
            onDelete={onDelete}/>;
        })}
        </div>
    )
}

export default memo(ContactList);
const ContactItem = ({contact, onDelete}) => {
    const onDeleteButtion = () => {
        onDelete(contact.id);
    }

    return (
        <div className="ContactItem">
            <div className="name">{contact.name}</div>
            <div className="email">{contact.email}</div>
            <button 
            onClick={onDeleteButtion}
            name="remove"
            >🗑️ Remove</button>
        </div>
    )
}

export default memo(ContactItem);

답변 2

0

이정환 Winterlood님의 프로필 이미지
이정환 Winterlood
지식공유자

안녕하세요 유일용님

우선 이전 질문의 답변은 도움이 되셨을까요? 질문을 올리시기 질문 가이드 라인을 꼭 확인하시어 답변이 도움이 되셨다면 답글 or 해결 완료 버튼을 눌러주시면 감사하겠습니다.

image.png

 

React.memo를 적용했음에도 리렌더링이 발생하는 정확한 이유는 프로젝트 전체 코드를 확인해봐야 알 수 있겠지만, 우선 지금으로써는 onDelete 함수가 useCallback으로 최적화 되지 않고 있기 때문인것 같습니다. 챌린지 정답 코드와 상세히 비교해보시면 이유를 알 수 있을겁니다.

만약 useCallback으로 최적화 과정을 모두 정상적으로 진행했음에도 리렌더링이 계속 발생한다면 이는 React Developer Tools의 오류로 인해 발생하는 상황일 수 있습니다. 따라서 정확한 확인을 위해 console.log로 다시 테스트 해보시길 권장드립니다.

PS. 본 질문 게시판은 인프런 강의를 위한 질문 게시판으로 앞으로 챌린지 관련 질문은 카페의 "챌린지 질문 게시판"을 통해 부탁드립니다.

유일용님의 프로필 이미지
유일용
질문자

네 답변 감사합니다. console.log로 확인한 결과

React Developer Tools의 오류로 인해 발생하는 상황으로 예상됩니다.

0

안녕하세요, 인프런 AI 인턴입니다. 유일용님이 질문하신 React.memo를 사용했음에도 컴포넌트가 예상과 다르게 리렌더링 되는 문제에 대해 답변 드리겠습니다.

React.memo를 사용하면 props가 변경되지 않는 한 컴포넌트의 리렌더링을 방지할 수 있습니다. 그러나 ContactEditor에서 텍스트 입력 시 ContactList가 리렌더링 되는 이유는 아마도 이런 경우일 수 있습니다:

  1. 부모 컴포넌트에서 리렌더링이 발생: 부모 컴포넌트가 리렌더링되면 기본적으로 그 하위 컴포넌트인 ContactList도 리렌더링이 트리거됩니다. 부모 컴포넌트에서 전달하는 props나 state가 변경되었기 때문일 수 있습니다.

  2. 동일한 참조 객체의 변경: contacts props가 변경 또는 업데이트되었을 경우, 이는 React.memo의 비교 함수에서 다른 참조로 인식하여 재렌더링이 발생할 수 있습니다. 이 경우, contacts를 새로운 배열로 만드는 대신, 기존 배열에 변동이 없이 그대로 유지되도록 해주어야 합니다.

  3. 객체 참조의 불일치: 객체형이나 배열형 상태를 업데이트할 때 새로 생성된 참조를 유지하도록 useMemo 또는 useCallback을 사용해서 부모 컴포넌트에서 전달하는 props가 동일한 참조를 유지할 수 있도록 최적화합니다.

이와 관련된 문제와 해결방안에 대해 깊이 있게 설명된 유사한 사례를 참고하시길 권장합니다. 유사한 기존 질문과 답변들이 있어서 소개드립니다:

  1. Checkbox를 누르는데 왜 Editor가 리렌더링되나요?

    • 설명: 특정 상태 업데이트 및 객체 참조 유지에 대한 논의가 포함된 답변으로, 리렌더링 최적화 방법에 대해 설명하고 있습니다.
  2. 컴포넌트 리렌더링 관련 최적화 방법 문의

    • 설명: props 변경과 관련된 리렌더링을 방지하기 위한 최적화 방법에 대해 자세히 설명한 게시물입니다.

추가적인 최적화 방법에는 useMemouseCallback을 활용하여 부모 컴포넌트에서 전달하는 데이터를 불필요하게 재생성하지 않도록 하는 것이 중요합니다. 꼭 이러한 접근법을 시도해보세요.

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

유일용님의 프로필 이미지
유일용

작성한 질문수

질문하기