inflearn logo
강의

Course

Instructor

Bite-Sized React (React.js): From Basics to Practice

11.1) What is Context?

Context 질문드립니다.

373

samgangjumak

32 asked

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

Answer 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)이 새롭게 갱신되어도 리렌더되지 않는 기능이라도 있는 것인가요?

프론트엔드 학습 수준 문의

0

17

2

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

0

36

2

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

0

47

2

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

0

72

2

이후의 커리큘럼 문의

0

98

2

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

0

48

2

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

0

82

3

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

1

77

3

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

0

80

2

리액트 개정판 교재 질문

0

56

2

예제코드가 안나와요!

0

72

2

select a variant 선택에서 javascript와 javascript+react compiler 중 무엇을 선택해야하나요? com

0

101

2

onMouseEnter 관련 문의 드립니다

0

87

3

배열의 렌더링 관련 질문 드립니다.

0

69

2

2:40초 refObj를 콘솔로 출력시 오류가 발생합니다.

0

108

2

TS, 리액트 강의중에 뭘 먼저 수강하는게 좋을까요?

0

130

2

useCallback 적용한 onCreate, onUpdate, onDelete 함수..

0

65

1

vs code 자동완성관련 문의

0

104

2

91강 useEffect내에서 상태변화함수 호출시 발생하는 에러

1

173

2

87강 필터 함수 질문

0

64

2

useRef, useState count 비교

0

63

2

안된다고했던 이유가 무엇이었는지 모르겠습니다

0

84

2

85강에서 객체를 왜 클래스로 만들어서 new 하지 않는건지 궁금합니다.

0

72

2

투두리스트 실습을 충실히 진행한 상태에서 감정일기장 실습을 따라할 필요가 있을까요?

0

53

2