• 카테고리

    질문 & 답변
  • 세부 분야

    프론트엔드

  • 해결 여부

    미해결

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

21.07.29 01:17 작성 조회수 158

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로 비교를 해야되는데 말이죠.

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

답변 1

답변을 작성해보세요.

1

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

한수빈님의 프로필

한수빈

질문자

2021.07.29

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

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

 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로 검사해서 그런 거 아닌가 싶습니다...

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

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

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

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

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

한수빈님의 프로필

한수빈

질문자

2021.07.30

아 넵 맞습니다.

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

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

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

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

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