Context 질문드립니다.
373
32 asked
안녕하세요 선생님.
질문이 있어요.
그전까지는 이해가 되었는데 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} 이렇게 보내주면 안될까요?
강의를 두번 반복했는데도 잘 이해가 안되네요..
Answer 2
1
안녕하세요
이정환입니다.
질문이 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
안녕하세요! 강의를 보다가 같은 부분에서 질문이 생겨 답글 남깁니다! 위에서 말씀하신 것처럼 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

