useSelector 과 컴포넌트 렌더링

5:00 즘에 shallowEqual 은 value3 이 가지고 있는 모든 속성값을 다 비교해서 비효율 적인 측면이 있다고 하셨는데요. 이 부분 좀 더 설명해 주실 수 있을까요?
function useMySelector(selector) {
return useSelector(selector, shallowEqual)
}
// value3 의 모든 속성값을 비교하기 때문에 비효율
const value3 = useMySelector(state => state.value3);
// 이렇게 해주는게 좋다고 함. 이유는 잘 모르겠음.
const [value3] = useMySelector(state => [state.value3]);
위에 value3 를 꺼내오는 방법 2가지를 작성해 두었는데 후자의 방법이 좋다고 하셨는데 왜 배열로 하면 더 좋은지를 모르겠습니다. 그리고
function useMySelector(selector) {
return useSelector(selector, shallowEqual)
}
// shallowEqual O, 배열 X
const value3 = useMySelector(state => state.value3);
// shallowEqual O, 배열 O
const [value3] = useMySelector(state => [state.value3]);
// shallowEqual 옵션 x, 배열 X
const value3 = useSelector(state => state.value3);
value3 를 불러오는 위 3가지 케이스의 차이를 알 수 있을까요?
아마 제가 얕은 비교라는 말에 대해서 뭔가 잘 못 알고 있어서 더 헷갈리는 것 같은데 얕은 비교에 대한 정의도 한번 해주시면 좋을 것 같습니다.
답변 3
1
아래는 제가 이해한 내용인데 혹시 잘 못 이해한 부분이 있으면 짚어주시면 감사하겠습니다.
예제에서 shallowEqual 를 사용하지 않은 useSelector(state => state.value3) 는 이미 레퍼런스 비교를 하기 때문에 굳이 shallowEqual 를 사용할 필요가 없음. (오히려 shallowEqual 사용시 1-depth 객체의 모든 속성을 비교하기 때문에 비효율)
useMySelector(state => [state.value3]) 처럼 [] 형식으로 store 의 값을 꺼낼 경우 액션이 dispatch 될 때마다 매번 배열이 생성되고, 때문에 실제로 상태 변경이 없더라도 매번 컴포넌트가 렌더링 될 수 있는데, shallowEqual 사용해서 [] 의 1-depth 배열 아이템을 비교하도록 강제해서 변경 유무를 캐치하여 불필요한 렌더링을 하지 않도록함.
답변 감사합니다!
1
얕은 비교는 1-depth 깊이에 있는 속성만 비교합니다.
따라서 2-depth 이상 깊이 있는 속성의 값은 비교하지 않습니다.
얕은 비교에서 'state => [state.value3]' 이렇게 입력하면 배열의 아이템만 비교하는거라서 'prevItems[0] === nextItems[0]' 처럼 한 번의 비교로 끝납니다.
만약 'state => state.value3' 이렇게 입력했다면 value3에 1-depth로 붙어있는 모든 속성을 비교합니다. (속성이 100개면 100번 비교)
사실 value3을 불변 객체로 관리했다면 한 번의 비교면 충분한거라서, 여러 번 비교하는건 비효율적이거든요
useSelector 는 직접 비교를 합니다 (1번의 레퍼런스 비교)
따라서 아래 두 코드는 모두 1번의 비교만 하게 됩니다.
useMySelector(state => [state.value3])
useSelector(state => state.value3)
참고 링크: https://react-redux.js.org/api/hooks#equality-comparisons-and-updates
참고로 아래는 얕은 비교 코드입니다
https://github.com/facebook/react/blob/a9b035b0c2b8235405835beca0c4db2cc37f18d0/packages/shared/shallowEqual.js#L19
얕은 비교를 설명하는 '렌더링 속도를 올리기 위한 성능 최적화 방법1' 8:25 부분도 참고해주세요
자동완성기능이 안되네요 ..
0
500
3
화면에 에러가나네요 ...
0
517
2
setValue 함수 질문 있습니다.
0
841
1
찾아야한다 실습 문의
0
470
1
훅 기초 익히기 - 배치 처리와 순차적 처리의 차이
0
473
1
cra, next.js 관련 질문 드립니다!
0
606
1
useState 배열 비구조화 문법 질문!
0
253
1
Uncaught TypeError: Failed to execute 'removeChild' on 'Node': parameter 1 is not of type 'Node'
1
1082
2
Saga 오류 이거 혹시 왜이런지 알수 있을까요?
0
371
2
http://localhost:3001/user/search?keyword=u 이걸로 데이터를 보는데 저는 사이트에 연결할 수 없다고 나오네요
0
658
1
match
1
495
1
버튼이 생성되지 않습니다 .
0
288
1
혹시 import 옆에 파일 사이즈 표시 어떻게 하나요?
0
263
1
saga 문제
0
249
1
에러가 발생하는데 이유가뭘까요..?
0
389
2
선생님과 똑같이 했는데 다 rendering 됩니다.
0
203
1
컴포넌트와 컨테이너의 기준
0
316
1
커스텀훅의 개념과 함수차이
1
1199
1
useEffect 실전 활용법(1) 강의에서 질문있습니다.
0
338
1
리덕스, 사가파일들의 관리
0
208
1
useImperativeHandle 질문 입니다.
0
281
1
컴파일 문의드립니다.
0
204
1
React.memo 관련 질문이 있습니다.
0
374
1
Context API vs Redux 사용 빈도
0
213
1





