해결된 질문
작성
·
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
안녕하세요 유일용님
우선 이전 질문의 답변은 도움이 되셨을까요? 질문을 올리시기 질문 가이드 라인을 꼭 확인하시어 답변이 도움이 되셨다면 답글 or 해결 완료 버튼을 눌러주시면 감사하겠습니다.
React.memo를 적용했음에도 리렌더링이 발생하는 정확한 이유는 프로젝트 전체 코드를 확인해봐야 알 수 있겠지만, 우선 지금으로써는 onDelete 함수가 useCallback으로 최적화 되지 않고 있기 때문인것 같습니다. 챌린지 정답 코드와 상세히 비교해보시면 이유를 알 수 있을겁니다.
만약 useCallback으로 최적화 과정을 모두 정상적으로 진행했음에도 리렌더링이 계속 발생한다면 이는 React Developer Tools의 오류로 인해 발생하는 상황일 수 있습니다. 따라서 정확한 확인을 위해 console.log로 다시 테스트 해보시길 권장드립니다.
PS. 본 질문 게시판은 인프런 강의를 위한 질문 게시판으로 앞으로 챌린지 관련 질문은 카페의 "챌린지 질문 게시판"을 통해 부탁드립니다.
0
안녕하세요, 인프런 AI 인턴입니다. 유일용님이 질문하신 React.memo를 사용했음에도 컴포넌트가 예상과 다르게 리렌더링 되는 문제에 대해 답변 드리겠습니다.
React.memo
를 사용하면 props가 변경되지 않는 한 컴포넌트의 리렌더링을 방지할 수 있습니다. 그러나 ContactEditor에서 텍스트 입력 시 ContactList가 리렌더링 되는 이유는 아마도 이런 경우일 수 있습니다:
부모 컴포넌트에서 리렌더링이 발생: 부모 컴포넌트가 리렌더링되면 기본적으로 그 하위 컴포넌트인 ContactList도 리렌더링이 트리거됩니다. 부모 컴포넌트에서 전달하는 props나 state가 변경되었기 때문일 수 있습니다.
동일한 참조 객체의 변경: contacts
props가 변경 또는 업데이트되었을 경우, 이는 React.memo
의 비교 함수에서 다른 참조로 인식하여 재렌더링이 발생할 수 있습니다. 이 경우, contacts
를 새로운 배열로 만드는 대신, 기존 배열에 변동이 없이 그대로 유지되도록 해주어야 합니다.
객체 참조의 불일치: 객체형이나 배열형 상태를 업데이트할 때 새로 생성된 참조를 유지하도록 useMemo
또는 useCallback
을 사용해서 부모 컴포넌트에서 전달하는 props가 동일한 참조를 유지할 수 있도록 최적화합니다.
이와 관련된 문제와 해결방안에 대해 깊이 있게 설명된 유사한 사례를 참고하시길 권장합니다. 유사한 기존 질문과 답변들이 있어서 소개드립니다:
Checkbox를 누르는데 왜 Editor가 리렌더링되나요?
추가적인 최적화 방법에는 useMemo
와 useCallback
을 활용하여 부모 컴포넌트에서 전달하는 데이터를 불필요하게 재생성하지 않도록 하는 것이 중요합니다. 꼭 이러한 접근법을 시도해보세요.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
네 답변 감사합니다. console.log로 확인한 결과
React Developer Tools의 오류로 인해 발생하는 상황으로 예상됩니다.