inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

[수정] 린캔버스 수정 1

린캔버스 수정 시 CanvasDetail 컴포넌트 리랜더링 질문

73

inflearn1

작성한 질문수 1

0

안녕하세요. 린캔버스 수정 수업 관련해서 질문이 있어서 문의 드립니다.

  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값이 남아있는 것 같습니다. 전체적인 코드를 동일하게 작성한 것 같은데 차이점이 발생하는 이유가 무엇일까요?

react React-Context react-router tailwindcss react-query

답변 2

0

짐코딩

안녕하세요 아래 체크 포인트를 확인해 보시겠어요?

LeanCanvas.jsx - handleNotesChange 함수를 확인하세요:

const handleNotesChange = (section, updatedNotes) => {
  const updatedCanvas = {
    ...canvas,  // ← 이게 있나요?
    [section]: { ...canvas[section], notes: updatedNotes }, // ← 여기도 스프레드 두 개 다 있나요?
  };
  onCanvasChange(updatedCanvas);
};

 

  • ...canvas 누락 → 다른 섹션 데이터 사라짐

  • ...canvas[section] 누락 → 해당 섹션의 다른 속성 사라짐

위 코드를 살펴보시면 도움이 될 것 같아요~!

 

0

inflearn1

넵 다 있습니다!

image.png

 

0

인프런 AI 인턴

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

리액트의 리렌더링 문제는 종종 상태 관리와 컴포넌트의 설계가 밀접하게 연관되어 발생합니다. 특히, 특정 조건에서 하위 컴포넌트의 상태가 의도와 다르게 초기화되는 경우는 개발자들에게 혼란을 줄 수 있습니다. 질문하신 CanvasDetail과 그 하위 컴포넌트들이 리렌더링되면서 NoteisEditing 값이 초기화되는 문제에 대한 이해를 돕기 위해 몇 가지 포인트를 설명해 드리겠습니다.

주요 원인 및 해결 방법

  1. 상태(State) 관리:

    • setCanvas(updatedCanvas)를 호출하게 되면, 리액트에서 canvas와 관련된 모든 컴포넌트들이 리렌더링될 수 있습니다. 이 때, 하위 컴포넌트인 Note에서 isEditing과 같은 상태가 부모 컴포넌트의 상태변경으로 인해 초기화될 수 있습니다.
  2. useState와 상태 초기화:

    • Note 컴포넌트가 독립적인 상태 isEditing을 가지지만, 부모의 상태나 props가 변할 때 리렌더링 되며 상태가 초기화될 수 있습니다. 이를 해결하기 위해서는 Note 컴포넌트가 상태를 유지할 수 있도록 부모와 자식 간의 상태 관리 전략을 다시 점검할 필요가 있습니다.
  3. 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