react코드가 궁금해서 찾아보다가
https://github.com/facebook/react/blob/41f0e9dae3b81396dc29a4735b355ea318cc5772/packages/react-server/src/ReactFizzHooks.js#L361
여기에 useMemo, useReducer, useState 등등이 있길래 보고잇는데,
1.
- export function useState<S>(
- initialState: (() => S) | S,
- ): [S, Dispatch<BasicStateAction<S>>] {
- if (__DEV__) {
- currentHookNameInDev = 'useState';
- }
- return useReducer(
- basicStateReducer,
- // useReducer has a special case to support lazy useState initializers
- (initialState: any),
- );
- }
useState는 이런 식으로 구현되어있는데,
이거는 useState가 useReducer에서 특정기능만 사용하도록 감싸서 만든 거임???
2. useReducer has a special case to support lazy useState initializers
1번 질문이랑 관련해서 이거 해석이 궁금한데,
ㄱ. useState가 lazy initializer일때는 useReducer가 갖고 있는 special case로 쓰이로 구현이 된다 뭐 이런걸까??
ㄴ. 아님 걍 1번처럼, useReducer가 special case를 갖고 있는데, 그게 useState이다
이거일까??
3. useMemo에서
- function useMemo<T>(nextCreate: () => T, deps: Array<mixed> | void | null): T {
- currentlyRenderingComponent = resolveCurrentlyRenderingComponent();
- workInProgressHook = createWorkInProgressHook();
- const nextDeps = deps === undefined ? null : deps;
- if (workInProgressHook !== null) {
- const prevState = workInProgressHook.memoizedState;
- if (prevState !== null) {
- if (nextDeps !== null) {
- const prevDeps = prevState[1];
- if (areHookInputsEqual(nextDeps, prevDeps)) {
- return prevState[0];
- }
- }
- }
- }
- if (__DEV__) {
- isInHookUserCodeInDev = true;
- }
- const nextValue = nextCreate();
- if (__DEV__) {
- isInHookUserCodeInDev = false;
- }
- // $FlowFixMe[incompatible-use] found when upgrading Flow
- workInProgressHook.memoizedState = [nextValue, nextDeps];
- return nextValue;
- }
원본코드 보니깐
피보나치 구현할 때 공부한 memoization이 사용 된 거 같음.
dependency가 같은 지 확인한 다음,
같으면 prevState[0]번 넘겨주고 아니면
const nextValue = nextCreate();로 하나 만들어서 넘겨주고 얘는 저장하고..
이런 거는 스택(재귀함수에서 함수호출하면 쌓이는 그 스택)에 저장되는 게 아니라 메모리를 써서 저장하는 거니까
걍 어지간하면 이득아님???
메모리 공간을 차지하는 게 단점일 거 같긴한데,
어차피 리액트에서 내부적으로 뭔가를 만들어가지고 그거를 dom에 뿌리는 거라고 배웠는데,
그 뭔가를 저장해놓고, dependency가 같은지만 확인하는거니까 단점이 거의 없는 거아님???
useReducer가 뭔지 문서 좀 읽어보면 왜 useState가 저렇게 만들어졌을지 추론할 수 있음 useMemo는 "이 값과는 관계 없는 다른 사유로 렌더링 될 때" 이득을 볼 수 있는 구조임. 그래서 극단적으로 예시를 들어서 props와 자식이 단 하나고 이 props가 바뀔 때마다 달라지는 값이 있다면 얘는 useMemo를 써봤자 이득을 볼 수 없음. 컴포넌트의 렌더링이 어떻게 일어날 지 생각을 해서 만일 다음 렌더링에 이 값이 반드시 무효화되지 않고 다시 사용되어야만 하겠다 싶은 생각이 들 때 쓰는거임
아 자식 없고 props 하나일때 잘못썼네
난 모르겠어...동의를 못한다는 게 아니라 왜 그런건지모르겠는데 좀 힌트를 알려줄 수 있음??? 왜 useState가 저렇게 만들어진거야??
useReducer는 state와 그 state에 어떤 action을 줘서 변화된 상태를 반환하는 reducer를 이용함 useState는 state와 setState를 뱉는데 이건 전달받은 action을 그대로 던져주는 reducer라고 볼 수 있겠지 그럼
아직 useReducer를 제대로 공부 안 해서 뭐라하는지 몰겠넹..나중에 더 공부해보고 답변 다시 읽어볼게용
Array.prototype.reduce 찾아보면 무슨 느낌인지 대강 알 수 있을듯
1번은 useReducer 구현에 initArgs가 function이면서 리듀서는 전역 state reducer인 케이스에 동작할 수 있도록 애드혹을 심어둔거 - dc App
useState에서만 쓰는 전역 state reducer가 있으니까 얘가 useState에서 온건지 유저가 useReducer 의 상태 인자로 함수를 준건지 구분할 수 있으니까 useReducer 내부적으로 애드혹 구현으로 분기가 되는거 - dc App
2번은 react에서 reconciliate를 할때 vdom diff를 하는 과정에서 어차피 prevState가 이전 vdom에 있어서 메모리 비용도 그냥 레퍼런스 하나밖에 없음 그냥 비교 비용이랑 훅을 위한 호출비용밖에 없음 - dc App
야딩조무사) vdom이 virtual dom말하는거임???저기서 쓰는 useMemo는 그럼 엄청 값싸게 쓰는거넹. ㄳㄳ
1번은 뭔가 쉽게 설명해준 거 같은데 내가 짬이 안되서 이해를 못하네..ㅎㅎ;;;공부 많이 해서 나중에 이해해볼게 답변 고마움
그리고 코드 더 살펴보니깐 내가 찾은건 react-server라는 라이브러리에서 쓰는 useState, useMemo, useReducer인듯..??
https://github.com/facebook/react/blob/main/packages/react/src/ReactHooks.js
여기가
평소에 쓰는 훅들 개발되이는 거 같고 이 코드는 보기 어려워서 일단 접어두기로 했음 ㅎㅎㅎㅎㅎ