inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

Redux vs MobX (둘 다 배우자!)

2-8. immer

immer 적용후 틱택토 초기화가 안됩니다

254

특별한 지렁이

작성한 질문수 39

1

틱택토에 이머 적용해 보았는데요

import React, { memouseStateuseReduceruseCallbackuseEffectuseRef } from 'react';
import Table from './Table';
import style from './TicTacToe.module.scss';
const { produce } = require('immer');

const initialState = {
  winner: '',
  turn: 'x',
  tableData: [
    ['','',''],
    ['','',''],
    ['','','']
  ],
  recentCell: [-1, -1]
}

const SET_WINNTER = 'SET_WINNER';
export const CLICK_CELL = 'CLICK_CELL';
const CHANGE_TURN = 'CHANGE_TURN';
const RESET_GAME = 'RESET_GAME';

const reducer = (stateaction=> {
  return produce(statedraft => {
    switch (action.type) {
      case SET_WINNTER:
        draft.winner = action.winner;
        break;
      case CLICK_CELL:
        draft.tableData[action.row][action.cell] = state.turn;
        draft.recentCell = [action.rowaction.cell];
        break;
      case CHANGE_TURN:
        draft.turn = state.turn === 'o' ? 'x' : 'o';
        break;
      case RESET_GAME:
        draft = {
          ...initialState,
          winner: state.winner
        }
        break;
      default:
        break;
    }
  });
}

function TikTakTo() {
  const [statedispatch] = useReducer(reducerinitialState);
  const { tableDataturnwinnerrecentCell } = state;
  // const [winner, setWinner] = useState('');
  // const [turn, setTurn] = useState('o');
  // const [tableData, setTableData] = useState([
  //   ['','',''],
  //   ['','',''],
  //   ['','','']
  // ]);

  useEffect(() => {
    const [rowcell] = recentCell;
    if(row < 0) {
      return;
    }
    //Game over
    let end = true;
    tableData.map(row => {
      row.map(cell => {
        if(cell === '') {
          end = false;
        }
      })
    });

    if(
        (tableData[row][0] === turn && tableData[row][1] === turn && tableData[row][2] === turn) ||
        (tableData[0][cell] === turn && tableData[1][cell] === turn && tableData[2][cell] === turn) ||
        (tableData[0][0] === turn && tableData[1][1] === turn && tableData[2][2] === turn) ||
        (tableData[0][2] === turn && tableData[1][1] === turn && tableData[2][0] === turn)
      ) {
        // 승리
        dispatch({
          type: SET_WINNTER,
          winner: turn
        });
        end = true;
    } else {
      dispatch({
        type: CHANGE_TURN
      });
    }
    
    if(end) {
      dispatch({
        type: RESET_GAME
      });
    }
  }, [recentCell]);

  const onClickTable = useCallback(
    () => {
      dispatch({
        type: SET_WINNTER,
        winner: 'o'
      });
    },
    [],
  )
  return (
    <>
      <Table
        onClick={onClickTable}
        tableData={tableData}
        dispatch={dispatch}
      ></Table>
      { winner && 
        <div className={style.result}>
          {winner}님의 승리
        </div>
      }
    </>
      
  )
}

export default memo(TikTakTo);

다른건 문제없이 작동하는데,  승리나 무승부 한 후에 테이블데이터 리셋 결과가 화면에 적용되지 않습니다. 리셋게임부분에 뭔가 코드를 잘못 적은걸까요..?

mobx redux

답변 5

1

제로초(조현영)

draft.x = 'y' 같이 draft 내부 속성을 바꾸는 건 인식하는데

draft = 'z' 처럼 draft 자체를 바꾸는 건 인식 못합니다.

1

제로초(조현영)

RESET_GAME쪽에 return draft 추가해보세요.

0

제로초(조현영)

네 반대입니다.

0

특별한 지렁이

아 immer안쓰는거랑 반대네요!!?

0

특별한 지렁이

오 됩니다!! 근데 왜 리턴해주어야하는거죠?

다른 것들은 안해줘도 잘 동작하는데..

context api, redux를 혼용하는건 별로일까요?

0

367

1

섹션 3 mobx autorun 관련 질문입니다.

0

254

1

thunk 미들웨어 잡업 중 논리로직 단계? 질문이 있습니다.

0

285

1

rootSaga에서 call를 사용하는 이유가 궁금합니다.

0

356

1

observable의 함수를 익명함수로 바꿔봤습니다.

0

383

1

useSelector 리랜더링 질문있습니다.

0

382

1

비동기 action 타입을 뭘로 지정해야 할까요?

0

258

1

redux-thunk질문

0

432

1

state 변경 시 질문

0

346

1

state변경 시 질문

0

329

2

firstMiddleware와 thunkMiddleware 순서 질문

0

433

1

객체 동적 다이나믹 속성?? 질문

1

272

1

미들웨어 질문

0

247

1

리덕스 사가 실습 파일 확인 부탁드립니다!

1

581

2

1-6 강의에서 질문 있습니다!

1

359

1

redux-saga 깃헙 파일

0

369

1

createStore -> configureStore

0

300

1

전역 변수와 전역 상태 값

0

665

2

Redux toolkit 과 axios API 호출에 관한 질문입니다.

0

439

1

MobX Data

0

233

1

mobx state action 변화 감지 관련

0

713

1

mobx configure

0

207

1

리덕스 툴킷 과 saga질문

0

285

1

로깅 미들웨어 질문입니다

0

237

1