2024.06.26 프로그래머스 - React Task Management 3
React 로 만드는 Task Management App 3
에러 : Task 삭제, 업데이트 Reducer 작동 불량
처음에 작성했던 Reducer
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151
import { createSlice, PayloadAction } from "@reduxjs/toolkit"; import { IBoardItem, IList, ITask } from "../../types/index.ts"; type TBoardState = { modalActive: boolean; boardArray: IBoardItem[]; }; type TAddBoardAction = { board: IBoardItem; }; type TRemoveListAction = { boardId: string; listId: string; }; type TAddListAction = { boardId: string; list: IList; }; type TAddTaskAction = { boardId: string; listId: string; task: ITask; }; type TRemoveTaskAction = { boardId: string; listId: string; taskId: string; }; type TDeleteBoardAction = { boardId: string; }; const initialState: TBoardState = { modalActive: false, boardArray: [ ... ], }; const boardSlice = createSlice({ name: "board", initialState, reducers: { addBoard: (state, { payload }: PayloadAction<TAddBoardAction>) => { state.boardArray.push(payload.board); }, removeList: (state, { payload }: PayloadAction<TRemoveListAction>) => { state.boardArray = state.boardArray.map((board) => board.boardId === payload.boardId ? { ...board, lists: board.lists.filter( (list) => list.listId !== payload.listId ), } : board ); }, setModalActive: (state, { payload }: PayloadAction<boolean>) => { state.modalActive = payload; }, addList: (state, { payload }: PayloadAction<TAddListAction>) => { state.boardArray.map((board) => board.boardId === payload.boardId ? { ...board, lists: board.lists.push(payload.list) } : board ); }, addTask: (state, { payload }: PayloadAction<TAddTaskAction>) => { state.boardArray.map((board) => board.boardId === payload.boardId ? { ...board, lists: board.lists.map((list) => list.listId === payload.listId ? { ...list, tasks: list.tasks.push(payload.task), } : list ), } : board ); }, removeTask: (state, { payload }: PayloadAction<TRemoveTaskAction>) => { state.boardArray.map((board) => board.boardId === payload.boardId ? { ...board, lists: board.lists.map((list) => list.listId === payload.listId ? { ...list, tasks: list.tasks.filter( (task) => task.taskId !== payload.taskId ), } : list ), } : board ); }, updateTask: (state, { payload }: PayloadAction<TAddTaskAction>) => { state.boardArray.map((board) => board.boardId === payload.boardId ? { ...board, lists: board.lists.map((list) => list.listId === payload.listId ? { ...list, tasks: list.tasks.map((task) => task.taskId === payload.task.taskId ? payload.task : task ), } : list ), } : board ); }, deleteBoard: (state, { payload }: PayloadAction<TDeleteBoardAction>) => { state.boardArray = state.boardArray.filter( (board) => board.boardId !== payload.boardId ); }, }, }); export const { addBoard, removeList, setModalActive, addList, addTask, removeTask, updateTask, deleteBoard, } = boardSlice.actions; export const boardReducer = boardSlice.reducer;
처음에 removeTask와 updateTask reducer 함수를 작성할 때,
한가지 간과한 사항 있었는데,
이전의 다른 reducer들에서는 state.boardArray에 재할당하는 방식이 아닌, 그저 실행이 되는 방식으로 진행했었다.
오늘 처음 봤을 때는 차이를 잘 몰랐는데,
자세히 확인해보니, 재할당문을 사용하지 않는 reducer는 push 같은 메소드를 사용하여, 직접 state의 상태를 변화시킬 수 있는
방법을 사용했던 것이고,
지금 작성했던 removeTask와 updateTask reducer는 state의 boardArray의 값을 일부분만 변경해야 하기 때문에,
재할당 방식이 필요했던 것
한마디로 , 정말 항목자체가 추가 되는 거라면(push 메서드 같은) reducer함수의 몸체가
실행만
되어도 되는데일부분을 변경하는 것은, 이전의 state + 변경 된 State의 새로운 값 상태를 적용시켜야 하기 때문에,
state에 재할당 구문을 사용해야 한다.
바뀐 state Reducer
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150
import { createSlice, PayloadAction } from "@reduxjs/toolkit"; import { IBoardItem, IList, ITask } from "../../types/index.ts"; type TBoardState = { modalActive: boolean; boardArray: IBoardItem[]; }; type TAddBoardAction = { board: IBoardItem; }; type TRemoveListAction = { boardId: string; listId: string; }; type TAddListAction = { boardId: string; list: IList; }; type TAddTaskAction = { boardId: string; listId: string; task: ITask; }; type TRemoveTaskAction = { boardId: string; listId: string; taskId: string; }; type TDeleteBoardAction = { boardId: string; }; const initialState: TBoardState = { modalActive: false, boardArray: [...], }; const boardSlice = createSlice({ name: "board", initialState, reducers: { addBoard: (state, { payload }: PayloadAction<TAddBoardAction>) => { state.boardArray.push(payload.board); }, removeList: (state, { payload }: PayloadAction<TRemoveListAction>) => { state.boardArray = state.boardArray.map((board) => board.boardId === payload.boardId ? { ...board, lists: board.lists.filter( (list) => list.listId !== payload.listId ), } : board ); }, setModalActive: (state, { payload }: PayloadAction<boolean>) => { state.modalActive = payload; }, addList: (state, { payload }: PayloadAction<TAddListAction>) => { state.boardArray.map((board) => board.boardId === payload.boardId ? { ...board, lists: board.lists.push(payload.list) } : board ); }, // state.boardArray 재할당 addTask: (state, { payload }: PayloadAction<TAddTaskAction>) => { state.boardArray.map((board) => board.boardId === payload.boardId ? { ...board, lists: board.lists.map((list) => list.listId === payload.listId ? { ...list, tasks: list.tasks.push(payload.task), } : list ), } : board ); }, // state.boardArray 재할당 removeTask: (state, { payload }: PayloadAction<TRemoveTaskAction>) => { state.boardArray = state.boardArray.map((board) => board.boardId === payload.boardId ? { ...board, lists: board.lists.map((list) => list.listId === payload.listId ? { ...list, tasks: list.tasks.filter( (task) => task.taskId !== payload.taskId ), } : list ), } : board ); }, updateTask: (state, { payload }: PayloadAction<TAddTaskAction>) => { state.boardArray = state.boardArray.map((board) => board.boardId === payload.boardId ? { ...board, lists: board.lists.map((list) => list.listId === payload.listId ? { ...list, tasks: list.tasks.map((task) => task.taskId === payload.task.taskId ? payload.task : task ), } : list ), } : board ); }, deleteBoard: (state, { payload }: PayloadAction<TDeleteBoardAction>) => { state.boardArray = state.boardArray.filter( (board) => board.boardId !== payload.boardId ); }, }, }); export const { addBoard, removeList, setModalActive, addList, addTask, removeTask, updateTask, deleteBoard, } = boardSlice.actions; export const boardReducer = boardSlice.reducer;
문법은 계속 인지해서 나쁠게 하나 없는 것 같다!
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.