inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

11.1) Context란

Context 질문드립니다.

390

학운학운

작성한 질문수 32

2

안녕하세요 선생님.

 

질문이 있어요.

 

그전까지는 이해가 되었는데 Context강의가 유독 어렵네요...

 

먼저 DiaryStateContext.Provider의 value로 {data, onCreate, onRemove} 이렇게 넣으면 prop이 바뀌면 재생성된다는 것이 이해가 안되요. onCreate랑 onRemove는 useCallback으로 재생성 되는 것을 막아 놓은 것 아니었나요? 헷갈리네요.

 

두번째로 중첩으로 하는 이유가 잘 이해가 안 됩니다. 왜 중첩으로 하면 이게 해결이 될까요? 어차피 memoizedDispatches로 useMemo를 썼으면 그냥 DiaryStateContext.Provider에 value로 넣으면 안되는 건가요. 중첩으로 하는 이유가 잘 납득이 안됩니다. DiaryStateContext.Provieder value={data, memoizedDispatches} 이렇게 하면 안되나요? 그리고 useMemo로 묶는 부분도 다시 한번 설명해주실 수 있나요? useCallback으로 막아놨는데 왜 useMemo로 다시 묶어야 할까요 그냥 onCreate, onRemove, onEdit을 묶지 말고 따로따로 DiaryStateContext.Provider의 value로 {data, onCreate, onRemove} 이렇게 보내주면 안될까요?

 

강의를 두번 반복했는데도 잘 이해가 안되네요.. 

nodejs react javascript

답변 2

1

이정환 Winterlood

안녕하세요

이정환입니다.

질문이 3가지로 보이는데요 나누어서 설명 해 드리겠습니다 😃

질문 1.

먼저 DiaryStateContext.Provider의 value로 {data, onCreate, onRemove} 이렇게 넣으면 prop이 바뀌면 재생성된다는 것이 이해가 안되요. onCreate랑 onRemove는 useCallback으로 재생성 되는 것을 막아 놓은 것 아니었나요? 헷갈리네요.

먼저 DiaryStateContext.Provider에 value로 {data, onCreate, onRemove, onEdit}처럼 함수와 data를 함께 묶은 '객체'를 전달하게 되면 data의 값이 변경될 때 이 '객체' 자체가 다시 생성되게 됩니다. 이에 따라 함수는 재 생성되지 않지만 DiaryStateContext.Provider에게 전달되는 value가 재 생성되기 때문에 리렌더가 발생하게 됩니다.


질문 2.

두번째로 중첩으로 하는 이유가 잘 이해가 안 됩니다. 왜 중첩으로 하면 이게 해결이 될까요? 어차피 memoizedDispatches로 useMemo를 썼으면 그냥 DiaryStateContext.Provider에 value로 넣으면 안되는 건가요. 중첩으로 하는 이유가 잘 납득이 안됩니다. DiaryStateContext.Provieder value={data, memoizedDispatches} 이렇게 하면 안되나요?

여기서의 요점은 Context를 분리하는데에 있습니다.

memoizedDispatch는 말씀하신대로 useMemo로 래핑된 값이기에 재 생성되지 않습니다.

그러나 DiaryStateContext.Provider에게 value로 전달되는 객체가 재 생성됩니다. 왜냐면 data가 바뀌기 때문이지요 따라서 재 생성되지 않는 함수들은 아예 DiaryDispatchContext.Provider로 분리하여 전달하는 것 입니다.

질문 3.

그리고 useMemo로 묶는 부분도 다시 한번 설명해주실 수 있나요? useCallback으로 막아놨는데 왜 useMemo로 다시 묶어야 할까요 그냥 onCreate, onRemove, onEdit을 묶지 말고 따로따로 DiaryStateContext.Provider의 value로 {data, onCreate, onRemove} 이렇게 보내주면 안될까요?

useMemo로 묶는 이유는 객체를 재 생성하지 않기 위함입니다.

DiaryDispatchContext.Provider에게 value로 전달하는 객체에 담기는 함수들이 useCallback으로 재 생성되지 않도록 만들어졌다고 해도 data State가 변하는 순간 App 컴포넌트가 리렌더되어 DiaryDispatchContext.Provider에게 전달하는 객체 자체가 재 생성됩니다.

따라서 객체 자체도 재 생성하지 않게 하기 위해 useMemo를 사용한 것 입니다.

이해가 안되는 부분이 있다면 질문 추가로 더 부탁드립니다

감사합니다.

0

010jjj

안녕하세요! 강의를 보다가 같은 부분에서 질문이 생겨 답글 남깁니다! 위에서 말씀하신 것처럼 DiaryStateContext 컨테이너의 Props인 data가 변경되면 하위 컨테이너들이 모두 리렌더 되는 것 아닌가요?

아니면 <DiaryStateContext.Provider value={data}>

<Provider/>의 value에 객체가 아닌 단수 개의 인자(ex. data)만 전달되면 그 값(data)이 새롭게 갱신되어도 리렌더되지 않는 기능이라도 있는 것인가요?

useCallback ⊂ useMemo

0

6

2

라이브러리 설치 질문

0

13

2

linter 질문

0

18

2

감정일기장 vercel 배포 후 새로 고침 시 404페이지가 뜨는 이유

0

30

2

Sort 메서드 관련 아티클

0

35

2

4.1) React.js를 소개합니다 강의를 듣고 궁금한 점이 생겼습니다.

0

36

2

html, body에 적용하는 css 스타일 질문입니다.

0

34

2

eslint.config.js 설정 질문입니다.

0

85

2

존재하지 않는 일기 url입력 시 alert이 두 번 떠요

0

64

1

교재(3쇄)와 강의 내용 문의

0

64

2

12.13) 하단 여백 스타일링 관련 질문 드립니다.

0

86

2

에러 질문드립니다

0

99

2

VSCode 설정 문의

0

130

2

PPT 코드 관련 질문

0

65

2

useEffect와 lifecycle문의

0

87

2

프론트엔드 학습 수준 문의

0

106

2

리액트 챕터별 코드에서 eslint 설정파일이 없어요

0

109

2

데이터 로딩중 화면만 계속 나와요!!

0

97

2

퍼블리셔일경우 어느정도 수준까지 강의를 들어야할까요

0

128

2

이후의 커리큘럼 문의

0

148

2

실슬환경 설정에서 save후 console.log 부분이 새로고침이 안되는현상입니다.

0

101

2

최적화 관련 질문있습니다 (useMemo 등)

0

126

3

프로바이더 컴포넌트의 위치는 어떤 기준인가요?

1

121

3

Date 객체에 관련하여 질문드립니다.

0

119

2