inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

웹 게임을 만들며 배우는 React

7-3. action 만들어 dispatch 하기

CLICK_CELL action에서 tableData 갱신순서가 궁금합니다

해결된 질문

314

i1004gy

작성한 질문수 36

0

 

 case CLICK_CELL: {
      // table데이터를 얕은 복사를 한다
      const tableData = [...state.tableData];
      //이 부분 왜 필요한지 확인
      console.log(tableData);
      tableData[action.row] = [...tableData[action.row]];
      console.log(tableData);
      tableData[action.row][action.cell] = state.turn;
      console.log(tableData);
      return {
        ...state,
        tableData,
        recentCell: [action.row, action.cell],
      };
    }

tableData를 얕은 복사로 복사한다음에 row데이터를 갱신하고 cellData를 복사하는 갱신방법이 이해가 안되어서 하나씩 console.log를 찍으면서 확인해 봤습니다

GOMCAM 20230528_1349300483.png

확인을 해보니 tableData는

tableData[action.row] = [...tableData[action.row]];

이 코드가 실행되기 전부터 table에 갱신되 o값을 가지고 있었습니다 그래서 생각해볼때 tableData에 따로 추가적으로 갱신이 필요없어 보이는데 그렇다고 코드를 지워보니 제대로 동작은 안하는 것 같습니다 왜 추가적으로 갱신하는 코드를 넣어줘야하나요?

react

답변 1

0

제로초(조현영)

https://www.zerocho.com/category/JavaScript/post/5b2b45cf1350f9001b662ba6

이 실수에 빠지셨군요. 한 번 읽어보시길 바랍니다.

0

i1004gy

console.log는 객체의 변화를 실시간으로 반영하기 때문에 처음의 console.log부터 이미 값이 변경된것이 찍히는 거군요

case CLICK_CELL: {
      
      const tableData = [...state.tableData];
      tableData[action.row] = [...tableData[action.row]];
      tableData[action.row][action.cell] = state.turn;
     
      return {
        ...state,
        tableData,
        recentCell: [action.row, action.cell],
      };
    }

그래도 아직 이해가 안되는 점은 tableData에 state.turn을 넣을때

tableData[action.row][action.cell] = state.turn;

이 코드만 필요한거 같은데 왜

 tableData[action.row] = [...tableData[action.row]];

이 코드로 row의 값을 먼저 갱신해 주는 건가요?

0

제로초(조현영)

tableData[action.row]의 참조를 끊지 않으면 tableData[action.row][action.cell]이 달라졌는지 알지 못할 수도 있습니다.

리액트에서는 서로 다른지 비교할 때 다음 순서대로

tableData 참조가 같은지 먼저 보고, tableData[action.row]가 같은지 보고 tableData[action.row][action.cell]이 같은지를 봅니다.

그런데 만약 tableData[action.row][action.cell]은 다른데 tableData[action.row]가 같다면 데이터가 다른지 못 알아챌 수 있습니다. (selector 구조에 따라서)

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

0

211

2

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

0

89

2

렌더링 테스트 코드 (Hooks)

0

80

1

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

0

154

1

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

1

193

1

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

0

99

1

useMemo와 useCallback 사용 시기

0

208

2

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

0

228

1

action.type 불러오는 방식

0

222

2

onClickRedo 질문

0

172

1

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

0

249

1

npx webpack 실행시

0

316

1

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

0

236

1

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

0

311

1

react devtool이 enable 않됩니다.

0

532

2

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

0

414

2

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

0

332

1

npm run dev 할 때 에러발생

0

480

2

memo, PureComponenet, shouldComponentUpdate 관련 질문

0

207

1

devMiddleware의 필요성

0

353

1

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

0

937

2

path.join관련질문

0

283

2

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

0

376

1

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

1

494

4