-
카테고리
-
세부 분야
프론트엔드
-
해결 여부
해결됨
CLICK_CELL action에서 tableData 갱신순서가 궁금합니다
23.05.28 13:52 작성 조회수 192
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를 찍으면서 확인해 봤습니다
확인을 해보니 tableData는
tableData[action.row] = [...tableData[action.row]];
이 코드가 실행되기 전부터 table에 갱신되 o값을 가지고 있었습니다 그래서 생각해볼때 tableData에 따로 추가적으로 갱신이 필요없어 보이는데 그렇다고 코드를 지워보니 제대로 동작은 안하는 것 같습니다 왜 추가적으로 갱신하는 코드를 넣어줘야하나요?
답변을 작성해보세요.
0
조현영
지식공유자2023.05.28
https://www.zerocho.com/category/JavaScript/post/5b2b45cf1350f9001b662ba6
이 실수에 빠지셨군요. 한 번 읽어보시길 바랍니다.
i1004gy
질문자2023.05.31
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의 값을 먼저 갱신해 주는 건가요?
조현영
지식공유자2023.05.31
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 구조에 따라서)
답변 1