[4.4장 메모이제이션 훅] 4.4.3 memo 참조 비교
안녕하세요. 강사님! 학습 중에 궁금한 점이 생겼는데, 제가 이해하고 있는 내용이 맞는지 궁금해 질문 드립니다!
const obj1 = { a: 1 };
const obj2 = { a: 1 };
const obj3 = obj1;
console.log(obj1 === obj2); // false
console.log(obj1 === obj3); // true
자바스크립트에서 객체나 배열을 비교할 때 기본적으로 참조를 비교하는 것으로 알고 있습니다.
즉, 1번에서 두 객체가 같은 값을 가지고 있으나 메모리 주소가 달라 false를 출력하고,
2번에선 같은 메모리 주소를 참조해 true를 출력하는 것으로 알고 있습니다
여기서부터 제가 궁금했던 내용입니다!
캐시된 filteredPosts를 사용해 렌더링하는 경우를 가정했을 때 :
const filteredPosts = MyReact.useMemo(filterPosts, [posts, tag]);filteredPosts는 useMemo를 통해 filterPosts 함수로 생성된 배열을 클로저 공간에 넣어두고,
posts와 tag가 변경되지 않는다면 항상 똑같은 값을 FilteredPosts로 전달 =>
<FilteredPosts posts={filteredPosts} />
const FilteredPosts = MyReact.memo(({ posts }) => {
...
}
// FilteredPosts는 캐시된 filteredPosts를 memo 함수로 전달 =>
function memo(TargetComponent) {
return (nextProps) => {
...
const [prevValue, prevProps] = TargetComponenet.memorizedState;
if (prevProps === nextProps) {
return prevValue;
}
...
}
}그럼 여기 전달된 nextProps(캐시된 filteredProps)는 당연히 같은 메모리를 참조하니 깊은 비교 없이 참조 비교만으로도 비교가 가능하지 않나? 싶었습니다.
filteredPosts는 결과적으로 useMemo로 캐시되어있고, 새로 생성된 배열이 아니니 메모리 주소가 동일해 prevValue가 리턴되지 않을까? 했는데 아니더라구요..
useMemo를 통해 filteredPosts 배열의 참조는 동일하게 유지되고 있는건 맞는데,
{ posts: filteredPosts }
이렇게 FilteredPosts 컴포넌트에 전달되는 props 객체가 매번 새로운 객체로 생성돼서 그런건가? 싶은데 이게 맞는지 궁금해서 질문 드립니다..
답변 1
0
맞습니다. 수업에서는 JSX문법을 사용하기 때문에 프롭 인자 전달 값이 잘 보이지 않는데요. 자바스크립트로 바뀌면 이런 코드가 됩니다.
// <FilteredPosts posts={filteredPosts} />
React.createElement(FilteredPosts, {posts: filterdPosts} )함수를 호출할 때마다 { posts: filteredPosts } 란 리터덜 표현식에 의해 새로운 값이 생성되는데요. 이 때문에 캐시한 프롭 객체와 다른 값으로 판단하는 것입니다.
잘못된 useEffect 사용?
1
65
2
useEffect 의존성 질문
1
57
2
orderableProductItem 에 관하여...
0
56
2
강의 자료, 블로그, 깃 주소
0
63
1
React 훅 구현 원리와 실무 패턴 관련 질문 (useState, useEffect 순서 및 핸들러 구조)
1
104
2
pushState로 주소를 바꾸면 렌더링이 안 되는 이유가 궁금합니다.
1
87
2
FormControl 컴포넌트 사용시 htmlFor prop 값 넘길 때 중괄호 이유
1
123
1
dispatch 함수도 리렌더링 유발하지 않나요?
1
203
2
ProductItem에서 onClick = {onClick}을 달지 않아도 되는 이유
1
160
2
replaceState를 쓰지 않는 대안
1
196
2
setValue 메서드를 바인딩 해야 하는 이유
1
163
2
MyReact를 IIFE(즉시실행함수)로 설계하신 이유
0
208
2
useRef 관련하여 질문드립니다
0
152
2
렌더 프롭 관련하여 질문드립니다
0
183
2
[1.2장 상품목록 화면] 1.2.3 Button ...rest 관련 질문 드립니다.
1
395
2
[4.4장 메모이제이션 훅] 4.4.4 useCallback curried function에 관한 질문입니다.
1
317
2
[4.4장 메모이제이션 훅] 4.4.2 useMemo 에서 every 함수에 관한 질문입니다.
1
355
2
[4.3장 리듀서 훅] 4.3.7 활용 MyForm(풀이) 오타 제보 및 질문이 있습니다.
1
281
2
[4.1장 레프 훅] useRef관련 질문이있습니다.
1
334
1
[1.3장 주문 내역 화면] 1.3.5 Card 조합 질문 있습니다
2
284
1
[3.5장 컨택스트 훅] 3.5.2 useContenxt 에서 질문이 있습니다.
1
432
2
[1.3.6 상태정의] state 관련
1
259
1
[2.4장 다이얼로그 1] 2.4.5 withLayout(풀이) 에 관한 질문입니다.
1
272
1
[2.1장 컨택스트] 2.1.4 공급자와 소비자 / 에서 질문이 있습니다.
1
425
2





