inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

웹 게임을 만들며 배우는 React

6-5. useMemo와 useCallback

제로초님 강의 감사합니다. 근데 useMemo에서요!!

287

송지훈

작성한 질문수 28

0

const getWinNumbersMemo = useMemo(() => getWinNumbers(), []);
  const [winNumberssetWinNumbers= useState(getWinNumbersMemo);
 state에서 초기에 memo함수로 받아서
getWinNumbers함수가 렌더링이 처음 한번만 되
자나요
const onClickRedo = useCallback(() => {
    setWinBalls([]);
    setWinNumbers(getWinNumbers());
근데 여기서는 memo가 안된 getWinNumbers()를
썻는데 getWinNumbers가 한번만 렌더링 되는건 잘 이해가 안가네요
처음 useState에서 메모가 안된
초기함수를 받았을땐
getWinNumbers가 계속 호출되다가
초기함수를 memo된 함수로 받았을때는 왜 여기
부분도 같이 렌더링이 한번만 되나요???
여기는 메모함수를 받지 않앗는데요
    setBonus(null);
    setRedo(false);
    timeouts.current = [];
  }, [winNumbers]);
강의는 정말 너무 좋아요~

react

답변 9

1

제로초(조현영)

정리하자면 setWinNumbers에 getWinNumbers()를 넣었다고 해도

코드가 useState(getWinNumbersMemo)라면 리렌더링 시 getWinNumbers()가 호출되는 곳이 없으므로 getWinNumbers는 실행되지 않습니다.

1

제로초(조현영)

onClickRedo 함수는 클릭을 할 때, 그 때만 호출됩니다. 그 때 내부에 있는 getWinNumbers도 호출되는 것이고요. 그래서 따로 처리를 하지 않아도 클릭할 때만 getWinNumbers가 호출됩니다.

useState에 useMemo를 써준 것은 컴포넌트 리렌더링 시마다 useState의 getWinNumbers가 다시 호출되기 때문입니다. 그래서 여기서는 다시 호출되는 것을 막으려고 useMemo를 쓴 것이고요.

0

송지훈

제로초님 감사합니다.!!

좀 이따 생각을 좀 정리해봐야겟네요 ㅎㅎ..

오늘 하루도 수고하셨습니다.

내일도 좋은 하루 보내십쇼!!

0

제로초(조현영)

아 이해했습니다.

메모한 상태에서 onClickRedo를 클릭할 때 setWinNumbers(getWinNumbers())를 하면 setWinNumbers를 호출했으니 getWinNumbers()가 한 번 호출된 후 리렌더링이 되는데요.

리렌더링 때부터는 어차피 useState에 memo된 getWinNumbersMemo가 들어있으니 getWinNumbers가 호출되는 일이 없습니다. useState(getWinNumbersMemo)이지 useState(getWinNumbers())가 아니니까요.

개발자도구 Component 메뉴로 보시면 좀 더 정확한데요. onClickRedo를 했을 때 winNumbers랑 memo해둔 getWinNumbersMemo랑 다른 값입니다. 즉, memo된 값은 처음 렌더링될 때만 사용되는 값이고, 그 다음 setWinNumbers할 때부터는 memo된 기존 값은 아예 사용되지 않습니다.

개발자도구에서 Component 메뉴를 켜놓으시고 Lotto 컴포넌트를 클릭한 후 hooks에서 memo 값과 state값을 비교해보세요.

0

송지훈

그 부분은 이해했습니다.

제가 말을 잘 못해서 그런지  핀트가 어긋나는거 같네요ㅠㅠ

const [winNumber, setWinNumber] = useState(getWinNumbers())

메모를 안한 useState의 초기값일때 

onClickRedo

setWinNumbers(getWinNumbers())

각각 6번씩 getWinNumbers 함수가 6번씩 호출이 되자나요.

그런데

const [winNumber, setWinNumber] = useState(memoGetWinNumbers())

메모를 한 useState의 초기값일때 ( 이 때는 memo를 했으니 getWinNumbers()함수 한번 호출)

onClickRedo

setWinNumbers(getWinNumbers())

onClickRedo의 setWinNumbers(getWinNumbers())

메모를 안한 getWinNumbers()가 호출 되므로

redo가 호출 될때 getWinNumbers()가 6번 호출되어야하는거 아닌가요?

귀찮게 해드려서 죄송합니다.

그리고 고맙습니다.

0

제로초(조현영)

useState는 리렌더링이 발생하는 상황이면 어떤 상황이든지 계속 호출됩니다. bonus가 바뀌어도,  redo나 winBalls가 바뀌어도, winNumbers가 바뀌어도 매번 호출됩니다. 그래서 memo를 하는 것이고요.

0

송지훈

위의 상황 모두에서

일단은 onClickRedo는 한번만 실행되요~

제가 질문을 잘못했네요.

onClickRedo가 한번만 실행되는건 아는데

jsx 38번째 줄의

useState(getWinNumbers())가 왜 계속 호출될까요

onClickRedo의 setWinNumbers(getWinNumbers())가 그대로인데

winNumbers가 memo된 상태에서 메모안된 getWinNumbers로 다시 바꿧으니 콘솔이 계속 나와야하는거 아닌가요?

0

제로초(조현영)

38번째 줄이 어떤 상황에서 호출되는지 불분명합니다. onClickRedo 안에 콘솔로그 넣어보세요.

0

송지훈

처음 useState의 useMemo를 적용 전에는

첫 렌더링때와

한번 더 눌렀을때 둘다 콘솔로그가 계속 나오고

///

onClickRedo 함수는 클릭을 할 때, 그 때만 호출됩니다. 그 때 내부에 있는 getWinNumbers도 호출되는 것이고요. 그래서 따로 처리를 하지 않아도 클릭할 때만 getWinNumbers가 호출됩니다.

///

onClickRedo 함수는 클릭을 할 때, 그 때만 호출이되는거면

여기서도 한번만 찍혀야 되는거 아닌가용?

제가 혹시 이해 못한 부분이 있다면 지적 부탁드립니당.

================================================================

useState에 첫 데이터에 useMemo를 적용햇을때

onClickRedo의 setWinNumbers(getWinNumbers())가 그대로인데

winNumbers가 memo된 상태에서 메모안된 getWinNumbers로 다시 바꿧으니 콘솔이 계속 나와야하는거 아닌가요?

왜 하나만 찍히는지 ....

제가 혹시 이해 못한 부분이 있다면 지적 부탁드립니당.

감사합니다.!!

npm run dev 실행 시 포트가 안뜨는 문제

0

202

2

timeouts.current를 useEffect 의 input값으로 넣었을때

0

85

2

렌더링 테스트 코드 (Hooks)

0

80

1

Cannot find package 'react-refesh' 이런 에러 뜨시는 분들 보세요.

0

149

1

해당 에러 뜨는 분들 보세요. "Uncaught TypeError: ReactDom.createRoot is not a function"

1

191

1

강사님 레포지토리에서 코드 복사 시 master 브랜치 말고 react18 브랜치꺼 복붙하세요ㅠㅠ

0

95

1

useMemo와 useCallback 사용 시기

0

205

2

onRightClickTd가 작동을 하지 않습니다.

0

226

1

action.type 불러오는 방식

0

222

2

onClickRedo 질문

0

172

1

const Try = require(./Try) 빨간줄

0

248

1

npx webpack 실행시

0

313

1

지뢰찾기 강좌에서 빈칸들 한번에 열기 파트에서 여쭤보고싶은부분이 있어서 글 올립니다.

0

235

1

강좌에서 다루지 않은 기능들은 어떻게 학습하면 좋을까요?

0

311

1

react devtool이 enable 않됩니다.

0

530

2

React 랜더링이 되지 않습니다.

0

410

2

비동기로 동작하는 setState에 대해서

0

331

1

npm run dev 할 때 에러발생

0

478

2

memo, PureComponenet, shouldComponentUpdate 관련 질문

0

206

1

devMiddleware의 필요성

0

352

1

리액트에서 화살표 함수를 사용해야하는 이유

0

935

2

path.join관련질문

0

282

2

2-9. 웹팩 데브 서버와 핫 리로딩 설치과정 시 에러

0

374

1

next.js 에서 이와 비슷한 예제를 돌리고있는데 react랑 달라서 질문 드립니

1

491

4