ํฐ์คํ ๋ฆฌ ๋ทฐ
์๋ฒ์์ ๊ฐ์ ธ ์จ ๋ฐ์ดํฐ๊ฐ redux store์ ์ ์ฅ๋๋ ์๋ ๋ฌธ์ _immer produce
choi95 2021. 12. 24. 16:11๋ฌธ์
ํ์ฌ mainPage redux store์๋ ํฌ๊ฒ ์ฝํ ์ธ ๋ฅผ ๋ณด์ฌ์ฃผ๋ contents์ ์ฌ์ฉ์ ๋ฐฉ์ ๋ณด์ฌ์ฃผ๋ roomList๊ฐ ์ ์ฅ๋์ด ์๋ค.
redux-saga๋ฅผ ํตํด ์๋ฒ์ API ํต์ ์ ํ์ฌ ๊ฐ๊ฐ์ ๋ฐฐ์ด ๋ด์ ๋ฐ์ดํฐ๋ค์ ์ ์ฌํด์ฃผ๋ ๊ณผ์ ์์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์๋๋ฐ, contents์ ํด๋นํ๋ ๋ฐ์ดํฐ๋ค์ ์๋ฒ์์ ๋ฌธ์ ์์ด ๊ฐ์ ธ์ ์ ์ฅ๋๋ ๋ฐ๋ฉด์, roomList์ ํด๋นํ๋ ๋ฐ์ดํฐ๋ค์ ์ ์ฅ๋์ง ์์๋ค.
์ฒ์์๋ ์๋ฒ์ API ํต์ ํ๋ ๊ณผ์ ์์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ค ์๊ณ Promise ํ์ ๋ฉ์๋์ธ then ๋ฉ์๋ ๋ด์์ ์ฝ์์ ์ฐ์ด๋ดค๋๋ฐ, ๋ฌธ์ ์์ด roomList์ ํด๋นํ๋ ๋ฐ์ดํฐ๋ค๋ ๊ฐ์ ธ์๋ค.
๋ฌธ์ ํด๊ฒฐ
ํ์ฐธ์ ํด๋น Blocker์ ๋ํด์ ๊ณ ๋ฏผํ ๊ฒฐ๊ณผ, ๋ฆฌ์กํธ ์์์ ๋ถ๋ณ์ฑ์ ์ง์ผ์ฃผ์ง ๋ชปํด ๋ฐ์ํ ๋ฌธ์ ์์ ํ์ธํ์๋ค.
์๋์ ๊ฐ์ด ์ฝ๋ ์์์ contents์ roomList์ ํด๋นํ๋ API ํต์ ์ ์งํํ์๊ณ ,
useEffect(() => {
dispatch(initializeMainForm()); // mainPage ์ด๊ธฐํ
if (sort === "friends") {
batch(() => {
dispatch(friendList());
dispatch(friends());
});
} else {
batch(() => {
dispatch(content({ sort }))
dispatch(rooms({ sort }));
});
}
resetPageScroll();
}, [dispatch, sort]);
redux-saga๋ฅผ ํตํด ๋ฐ์ ์จ ๋ฐ์ดํฐ๋ฅผ action.payload์ ํ ๋นํ๊ณ redux-store์์ contents์ roomList ๋ฐฐ์ด์ ํด๋น ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ์ด๊ธฐ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์๋ค.
const mainForm = handleActions(
{
[INITIALIZE_MAINFORM]: state => initialState,
[CONTENT_SUCCESS]: ({ contents }, { payload: { message } }) => ({
contents: contents.concat(message),
contentsError: null,
}),
[CONTENT_FAILURE]: (state, { payload: error }) => ({
...state,
contentsError: error,
}),
[ROOMS_SUCCESS]: ({ contents }, { payload: { message } }) => ({
contents: contents.concat(message),
contentsError: null,
}),
[ROOMS_FAILURE]: (state, { payload: error }) => ({
...state,
contentsError: error,
}),
},
initialState
);
contents์ roomList๋ฅผ ๊ฐ์ธ๊ณ ์๋ ์์ ๊ฐ์ฒด_initialState์ ์ด์ ๊ฐ์ ๋ณต์ฌํ์ฌ ์๋ก์ด ๊ฐ์ ํ ๋นํ์ง ์์ ์ฑ, CONTENT_SUCCESS / ROOMS_SUCCESS ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ๋๋ง๋ค ์๋ก์ด ๊ฐ์ฒด ๊ฐ์ ์ฌํ ๋นํด์ฃผ๋ ๋ฐ๋์ ํด๋น Blocker๊ฐ ๋ฐ์ํ์๋ ๊ฒ์ด๋ค.
์ด์ ํด๋น ์ฝ๋์ ๋ถ๋ณ์ฑ์ ์ข ๋ ์์ ์ ์ด๊ณ ํธํ๊ฒ ์ง์ผ์ฃผ๊ธฐ ์ํด immer ๋ชจ๋์ produce๋ฅผ ์ฌ์ฉํ์ฌ ๋ฆฌํฉํ ๋งํ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์๋ค.
const mainForm = handleActions(
{
[INITIALIZE_MAINFORM]: state => initialState,
[CONTENT_SUCCESS]: (state, { payload: { message } }) =>
produce(state, draft => {
draft.contents = state.contents.concat(message);
draft.contentsError = null;
}),
[CONTENT_FAILURE]: (state, { payload: error }) => ({
...state,
contentsError: error,
}),
[ROOMS_SUCCESS]: (state, { payload: { message } }) =>
produce(state, draft => {
draft.contents = state.contents.concat(message);
draft.contentsError = null;
}),
[ROOMS_FAILURE]: (state, { payload: error }) => ({
...state,
contentsError: error,
}),
},
initialState
);
๊ฒฐ๊ณผํ๋ฉด