-
axios 요청을 redux안에 넣었을 때 발생하는 에러project/main 2023. 3. 24. 21:07
에러
원인
redux로 리팩토링하는 과정에서 axios 요청을 redux안에 넣고 싶다라는 생각에 넣어 봤더니 생긴 에러이다.
boardListItemAdd: ( state, ) => { const fetchData = async () => { const res = await axios.get(`/boards?page=${isPage}&size=16`); const { data, likeList } = res.data; const result = data.map((board: BoardDataProps) => { return { ...board, like: likeList.some( (el: { boardId: number; boardTitle: string }) => el.boardId === board.boardId ), }; }); state.likeList = likeList; if ( state.listData.length !== 0 && state.listData.filter((el) => el.boardId === data[0].boardId).length === 0 ) { state.listData = [...state.listData, ...result]; } else if (state.listData.length === 0) { state.listData = result; } } fetchData(); }
- 리듀서는 순수 함수여야한다.
- 순수 함수란 side effect를 발생시키지 않는 함수를 말한다.
- side effect란 함수에서 값을 반환하는 것 말고 외부의 상태나 동작이 변경되는 것을 말한다.
- 즉, axios 요청이 side effect를 발생시키기 때문에 발생하는 에러이다.
해결
axios 요청을 redux의 reducer안에 사용하지 않고 외부에서 사용해 응답으로 받아온 데이터를 reducer로 전달하는 방향으로 수정했다.
// BoardList.tsx useEffect(() => { setIsLoading(true); const fetchData = async () => { const res = await axios.get(`/boards?page=${isPage}&size=16`); const { data, likeList } = res.data; dispatch(boardListItemAdd({ data, likeList })); // reducer로 전달 setIsLoading(false); }; fetchData(); }, [isPage, dispatch]); // BoardListSlice.ts boardListItemAdd: ( state, { payload: { data, likeList }, // 전달 받은 데이터 }: PayloadAction<{ data: BoardDataProps[]; likeList: ILikeList[] }> ) => { const result = data.map((board: BoardDataProps) => { return { ...board, like: likeList.some( (el: { boardId: number; boardTitle: string }) => el.boardId === board.boardId ), }; }); state.likeList = likeList; if ( state.listData.length !== 0 && state.listData.filter((el) => el.boardId === data[0].boardId).length === 0 ) { state.listData = [...state.listData, ...result]; } else if (state.listData.length === 0) { state.listData = result; } }
'project > main' 카테고리의 다른 글
무한 스크롤 또 또 에러 (0) 2023.03.26 무한 스크롤 또 에러 (0) 2023.03.25 React환경에서 S3에 배포 후 새로고침 에러 (0) 2023.03.23 메인 화면 Carousel 구현하기 (0) 2023.03.22 무한 스크롤 중복 데이터 에러 수정 (0) 2023.03.21 - 리듀서는 순수 함수여야한다.