린캔버스 수정 시 CanvasDetail 컴포넌트 리랜더링 질문
73
작성한 질문수 1
안녕하세요. 린캔버스 수정 수업 관련해서 질문이 있어서 문의 드립니다.
const handleCanvasChange = async updatedCanvas => {
try {
await updateCanvas(id, updatedCanvas);
setCanvas(updatedCanvas);
} catch (err) {
alert(err.message);
}
};addNote, deleteNote, updateNote 등의 이벤트가 발생할 경우 setCanvas를 통해 useState에 선언된 canvas 값을 바꾸는데 그렇게 되면 CanvasDetail과 그 하위에 선언된 자식 컴포넌트들이 전부 리랜더링되는 것 같은데 강의에서는 그렇게 보이지 않아서 문의 드립니다.
const [canvas, setCanvas] = useState();canvas가 setCanvas 메서드를 통해서 상태가 변하면 리랜더링 되면서 하위 컴포넌트인 Note의 isEditing 값이 다시 false로 초기화되는데 강의에서는 여전히 true값이 남아있는 것 같습니다. 전체적인 코드를 동일하게 작성한 것 같은데 차이점이 발생하는 이유가 무엇일까요?
답변 2
0
안녕하세요 아래 체크 포인트를 확인해 보시겠어요?
LeanCanvas.jsx - handleNotesChange 함수를 확인하세요:
const handleNotesChange = (section, updatedNotes) => {
const updatedCanvas = {
...canvas, // ← 이게 있나요?
[section]: { ...canvas[section], notes: updatedNotes }, // ← 여기도 스프레드 두 개 다 있나요?
};
onCanvasChange(updatedCanvas);
};
...canvas누락 → 다른 섹션 데이터 사라짐...canvas[section]누락 → 해당 섹션의 다른 속성 사라짐
위 코드를 살펴보시면 도움이 될 것 같아요~!
0
안녕하세요, 인프런 AI 인턴입니다. inflearn1님.
리액트의 리렌더링 문제는 종종 상태 관리와 컴포넌트의 설계가 밀접하게 연관되어 발생합니다. 특히, 특정 조건에서 하위 컴포넌트의 상태가 의도와 다르게 초기화되는 경우는 개발자들에게 혼란을 줄 수 있습니다. 질문하신 CanvasDetail과 그 하위 컴포넌트들이 리렌더링되면서 Note의 isEditing 값이 초기화되는 문제에 대한 이해를 돕기 위해 몇 가지 포인트를 설명해 드리겠습니다.
주요 원인 및 해결 방법
상태(State) 관리:
setCanvas(updatedCanvas)를 호출하게 되면, 리액트에서canvas와 관련된 모든 컴포넌트들이 리렌더링될 수 있습니다. 이 때, 하위 컴포넌트인Note에서isEditing과 같은 상태가 부모 컴포넌트의 상태변경으로 인해 초기화될 수 있습니다.
useState와 상태 초기화:
- 각
Note컴포넌트가 독립적인 상태isEditing을 가지지만, 부모의 상태나 props가 변할 때 리렌더링 되며 상태가 초기화될 수 있습니다. 이를 해결하기 위해서는Note컴포넌트가 상태를 유지할 수 있도록 부모와 자식 간의 상태 관리 전략을 다시 점검할 필요가 있습니다.
- 각
React가 제공하는 최적화 기법 사용:
React.memo같은 최적화 기법을 이용하여, 특정 props가 변경되지 않는 한 하위 컴포넌트가 리렌더링되지 않도록 할 수 있습니다.Note컴포넌트를React.memo로 감싸고 리렌더링 조건을 제어할 수 있습니다.
해결을 위한 보완 방안
- 하위 컴포넌트에서 리렌더링이 필요하지 않은 요소들은 상태를 컴포넌트 내부에서 관리하거나, 적절한 방법으로
useEffect훅을 활용하여 점검할 수 있습니다.
관련하여 아래의 링크들을 참고하시면 도움이 될 것입니다:
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
오타?
0
30
1
뭐하나 여쭤봐도 될까요?
0
70
1
안녕하세요 질문이 있습니다.
0
56
2
질문 : 삭제 버튼 아규먼트 (id)
0
50
1
Tailwind 버전 확인
0
63
1
align-items 정렬
0
50
2
vite 명령어로 프로젝트를 만들었습니다. (vscode)
0
79
1
31. 객체 업데이트 하기 - 10:15 질문
1
56
2
강의교안, 내용 인용해서 블로그 글 작성
1
80
2
이미지가 출력되지 않아요
1
76
2
강의와 만들어진 코드가 달라요
0
76
3
AI와 CSS 라이브러리의 궁합
0
97
1
onClick 이벤트에 함수 넘길 때
0
68
1
린캔버스 기능 구현은 왜 못하나요.... 구현하고 싶습니다...
0
101
1
notes 없음 읽기 오류
0
72
1
Object.assign 문법
0
64
1
react-router 전혀 기능 안함
0
54
1
react-router-dom@6.25.1
0
47
1
React Router 최신 스펙
0
209
1
Immer 에서 filter, map 사용
0
55
1
vite 설치에 대해 질문있습니다.
0
76
2
라이브러리 버전 일치 이슈
0
77
1
"Enter 키 발생 시 항목 추가" 부분에서 공백이 포함되면 한 줄이 더 입력됩니다
0
51
2
TotalCounter을 작성할때
0
66
2






