어제 context API를 이용한 리팩토링을 한 이후 오늘 오전까지 이어서 도전과제를 전부 달성했다. redux-toolkit, memoization, toaster을 사용하여 리팩토링, 불필요한 리렌더링 막기, alert 창 개선이다.
redux-toolkit 리팩토링은 이전에 context api로 리팩토링한 것들을 활용하면 되었기에 개선 그 자체는 크게 어렵지 않았고, memoaization을 처음 사용해봤는데, React.memo(컴포넌트)의 형식으로 코드를 조금만 수정해도 잘 작동을 하는 것을 확인할 수 있었다. toaster를 사용해서 alert 창을 개선하는 것도 간단했는데, <Toaster/>를 어디에 두어야하는지만 잘 알고 있으면 어렵지 않았다.
다만 문제는 오늘 튜터님이 내주신 챌린지반 과제로 reducer를 사용하여 todo-list를 작성하는 과정에서 문제가 좀 있었다.
reducer를 사용하는 것 자체는 redux와 비슷하기 때문에 크게 어렵지 않았는데, 문제는 reducer+context api를 합쳐주자 무언가 치명적인 오류가 발생해서 몇 시간 동안 과제를 붙잡고 있어도 과제를 끝내지 못한 것이다... 월요일까지 제출하면 되는 과제이니 어찌저찌 완료할 수 있을 것 같다고 생각하는데, 내 응용력이 이렇게 부족해서 실제 업무를 어떻게 할 수 있을지 걱정이 되었다.
오늘의 돌아보기는 여기까지하고, 나중에 reducer와 context api 합치는 문제를 해결하면 다시 글을 쓸 수 있을 것이다. 아래는 제목에 제시한 완료된 과제를 간단하게 명시하겠다.
//redux-toolkit 리팩토링
const initialState = [];
const pokemonSlice = createSlice({
name: "pokemon",
initialState,
reducers: {
addBtn: (state, action) => {
let sameId = false;
for (const element of state) {
if (element.id === action.payload.id) {
sameId = true;
break;
}
}
if (sameId) {
toast.warning("이미 추가한 포케몬입니다", {
toastId: action.payload.id,
});
return [...state];
}
if (state.length < 6) {
return [...state, action.payload];
} else {
toast.warning("더 이상 추가할 수 없습니다", {
toastId: action.payload.id,
});
}
},
deleteBtn: (state, action) => {
return state.filter((element) => {
return !(element.id === action.payload.id);
});
},
},
});
export const { addBtn, deleteBtn } = pokemonSlice.actions;
export default pokemonSlice.reducer;
//memoization으로 상태 유지하기
const AddForm = React.memo(Form);
export default AddForm;
//toaster 각 페이지의 반복문으로 돌리는 컴포넌트 안에 넣으면 오류가 발생함을 확인함
const Dex = () => {
return (
<div>
<Toaster richColors position="top-center" />
<Dashboard />
<PokemonList />
</div>
);
};
'til' 카테고리의 다른 글
Router 만들기 (0) | 2024.08.27 |
---|---|
reducer 만들기 (0) | 2024.08.26 |
리액트 숙련 4일 차 @개인과제 100% (0) | 2024.08.22 |
리액트 hook 만들기 (0) | 2024.08.21 |
cra, vite 없이 리액트 프로젝트 생성하기 (0) | 2024.08.20 |