inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

웹 게임을 만들며 배우는 React

7-4. 틱택토 구현하기

render -> effect 흐름 이거 아닌가요?

241

한수빈

작성한 질문수 9

0

useEffect에서 승리 검사를 하는데  turn이 달라서 애먹은 부분에서 설명하실 때요.

dispatch하면 recentCell이 바뀌어서 effect가 실행되는데

그 와중에 dispatch(change_turn)을 해서 내가 기대한 turn이 안 나왔다. 비동기를 잘 고려해야한다라고 하셨는데

제가 콘솔 찍어보면 그건 아닌 거 같습니다.

역시나 리액트돔이 dispatch로 발생된 setState들을 다 모아서 한번에 처리한다음 render 해줍니다.

그러면 흐름이

dispatch(click_cell), dispatch(change_turn)

-> render -> useEffect이고

useEffect 내부에서는

현재의 턴이 아니라 이전의 턴으로 승리인지 검사를 해줘야겠죠.

왜냐하면 click_cell시 O였다고 가정하면 

change_turn해서 X가 되고 

render -> useReducer로  state 받아올 시 

turn은 X가 나오겠죠?

click_cell시의 O로 비교를 해야되는데 말이죠.

이거 맞는지 확인 부탁드려요

react

답변 1

1

제로초(조현영)

아뇨. dispatch(click_cell)과 dispatch(change_turn)은 모아서 처리되지 않습니다. 서로 다른 사이클 함수에 있기 때문입니다. 각 dispatch 바로 위에, 그리고 컴포넌트 바로 위에 콘솔을 찍어보면 알 수 있습니다.

0

한수빈

일단 소중한 답변 감사합니다.

저는 리듀서를 이렇게 만들고

 td를 이렇게 구현했습니다. 

 td에서 클릭이벤트가 실행되면 dispatch를 세 번하면 setState가 세 번이 발생하잖아요?

하지만 여전히 setState를 모아서 한 번에 랜더를 해주는 모습으로 콘솔이 찍혀요.

이전 강의에서도 말씀하셨고 스택오버플로우에서도 그렇듯

setState는 비동기로 요청이 되기 때문에 리액트돔이 모아서 한 번에 처리를 해주기 때문에

이렇게 콘솔이 찍히는 걸로 보여요.

tr 도 콘솔 찍고

테이블도 콘솔 찍고

틱택토도 콘솔 찍어본 결과입니다.

 dispatch 연속 세 번 (click_cell, click_game, change_turn)

-> tictactoe render

-> table render

-> tr render

-> td render 

로 찍혔습니다.

강의에서 턴이 안 맞았던 이유는

change_turn 요청 당시 X였다면 요청 후 O로 바뀌고 

render -> effect 발생하고 

effect에서 chage_turn 호출 전 턴인 X로 검사를 해야하는데 

호출 후 바뀐 O로 검사해서 그런 거 아닌가 싶습니다...

제가 잘못 알고 있는 부분이 어떤 부분인지랑

서로 다른 사이클 함수는 또 무엇인지 알려주시면 감사하겠습니다.

0

제로초(조현영)

우선 제 강좌랑 코드가 다릅니다. 제 강좌에서는 저렇게 dispatch가 연달아 모아져있지 않았습니다. 저렇게 모아져 있으면 한번에 모아서 렌더링하는 게 맞습니다.

https://github.com/ZeroCho/react-webgame/tree/master/7.%ED%8B%B1%ED%83%9D%ED%86%A0

강좌랑 소스 코드가 다르면 당연히 수행 동작도 다를 수밖에 없습니다.

0

한수빈

아 넵 맞습니다.

마지막에 완성한 코드는 change_turn 액션을 tictactoe의 useEffect가 하기 때문에

당연히 change_turn -> render -> effect -> 게임 계산 -> dispatch -> render 가 맞죠.

근데 강의 중간에는 td에서 click_cell 액션과 chagne_turn을 td에서 연달아 요청을 했고

승자 계산을 useEffect에서 했었는데 turn이 달라지니까 change_turn을 useEffect로 옮기셨잖아요?

그래서 그 때 강의 중간의 코드일 땐 플로우가 제가 질문드린 흐름대로 가지 않는지에 대한 물음이였습니다.

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

0

236

2

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

0

97

2

렌더링 테스트 코드 (Hooks)

0

93

1

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

0

165

1

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

1

207

1

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

0

105

1

useMemo와 useCallback 사용 시기

0

218

2

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

0

236

1

action.type 불러오는 방식

0

225

2

onClickRedo 질문

0

176

1

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

0

259

1

npx webpack 실행시

0

324

1

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

0

241

1

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

0

318

1

react devtool이 enable 않됩니다.

0

544

2

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

0

421

2

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

0

337

1

npm run dev 할 때 에러발생

0

494

2

memo, PureComponenet, shouldComponentUpdate 관련 질문

0

210

1

devMiddleware의 필요성

0

358

1

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

0

946

2

path.join관련질문

0

287

2

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

0

384

1

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

1

502

4