Today, What I learned?
ํ์ ๋ถ์ SOS๋ก!.. ๋ฆฌ๋์ค๋ก ๊ตฌํ๋์ด ์๋ API ๋ถ๋ฌ์ค๋ ๋ก์ง์ redux-toolkit๊ณผ redux-thunk๋ก ๋ฆฌํฉํ ๋ง ํ๋ ๊ณผ์ ์ ๊ฐ์ด ๊ณ ๋ฏผํ๊ฒ ๋์๋ค. ๊ณ ๋ฏผ์ ์๊ฐ์ด ๊ธธ์๋ ์ด์ ๋ ์ฐ๋ฆฌ ํ๋ก์ ํธ๋ ํ์ ์คํฌ๋ฆฝํธ๋ก ๊ตฌ์ฑ๋ ํ๋ก์ ํธ์๊ธฐ ๋๋ฌธ์ด๋ค!..
ํ์ ์คํฌ๋ฆฝํธ์์์ createAsyncThunk
API๋ฅผ ๊ฐ์ ธ์ค๋ ๊ณผ์ ์์, ํ์ํ ์ ํ์ ๋งค๊ฐ๋ณ์๊ฐ 3๊ฐ๋ ๋์๊ธฐ ๋๋ฌธ์ ์ข ๋ ์ด๋ ค์ ๋ ๊ฒ ๊ฐ๋ค.
์๋๋ ์์ฑ๋ ๋ก์ง์ด๋ค. payload
์ ํด๋นํ๋ ๋ถ๋ถ์ ๊ตฌ์กฐ๋ถํดํ ๋น์ผ๋ก ๊ฐ์ ธ์์ ์ฌ์ฉํ๊ณ ์๋ค.
export const getSearchVideos = createAsyncThunk(
'getSearchVideos',
async ({ channelId, orderType, results }: VideoPayload, thunkAPI) => {
try {
const { data } = await request('/search', {
params: {
part: 'snippet',
channelId: channelId,
order: orderType ?? 'date',
maxResults: results ?? 50,
pageToken: '',
type: 'video',
},
});
return thunkAPI.fulfillWithValue(data);
} catch (error) {
return thunkAPI.rejectWithValue(error);
}
},
);
payload
์ ํ์
์ด ์์ ๊ฒฝ์ฐ ์๋ฌ๊ฐ ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ ์ด๋ ๊ฒ ํ์
์ ๋ฐ๋ก ์ง์ ํด ์ฃผ์๋ค. ์ฑ๋ ์์ด๋๋ฅผ ๋นผ๊ณ ๋ ์ ํ์ ์ด๋ค.
interface VideoPayload {
channelId: string;
orderType?: string;
results?: number;
}
ํ์ ์คํฌ๋ฆฝํธ์์์ extraReducers
ํ์
์คํฌ๋ฆฝํธ์์์ extraReducers์ ์ ์ํด ์ฃผ๋ ๋ฐฉ์์ ์กฐ๊ธ ๋ฌ๋๋ค.builder๋ผ๋
๊ฒ์ ์ด์ฉํด์ผ ํ๋ค!..
๋ฆฌ๋์ค ํดํท ๊ณต์ ๋ฌธ์์๋ ์ด๋ ๊ฒ ์ ์ํ๋ผ๊ณ ์๋ ค์ฃผ๊ณ ์๊ณ ,
์คํ ์ค๋ฒํ๋ก์ฐ์์๋.. builder๋ฅผ ์ฌ์ฉํด์ผ ํจ์ ์๋ ค์ฃผ๊ณ ์๋ค. ๋ฏ์ค์ง๋ง ์ฌ์ฉํด๋ณผ ์ ๋ฐ์...
์ฐธ๊ณ ๋ก ๋ฆฌ๋์ค ํดํท์ ํ์ ์คํฌ๋ฆฝํธ ์ ์ฉ ๊ด๋ จ ๊ณต์๋ฌธ์ ํญ๋ชฉ์ ์๋ ์ฃผ์!..
https://redux-toolkit.js.org/usage/usage-with-typescript
๊ทธ๋์ ์์ฑ๋ ์ฝ๋๋ ์ด๋ ๋ค.
const mediaSlice = createSlice({
name: 'media',
initialState,
reducers: {},
extraReducers: (builder) => {
builder.addCase(getSearchVideos.fulfilled, (state, { payload }) => {
state.search = payload.items;
state.nextPageToken = payload.nextPageToken;
});
},
});
ํดํท์ผ๋ก ๋ฆฌํฉํ ๋ง ํ์ผ๋ useSelector
์ useDispatch
๋ ๋ฐ๋ก ์ ์ํ์ฌ ์ฌ์ฉํด์ผ ํ๋ค.
์์์ payload์ ํ์ ์ค์ ์ ํ์ ์ผ๋ก ๋ค์ด๊ฐ๋ ๊ฐ์ ์ ํด์ฃผ์๊ธฐ ๋๋ฌธ์ ์๋์ ๊ฐ์ด ํธ์ถํ๊ฑฐ๋,
useEffect(() => {
dispatch(getSearchVideos({ channelId }));
}, [dispatch]);
์ด๋ฐ ์์ผ๋ก payload ๊ฐ์ ์ฃผ์ด ํธ์ถํ ์ ์์๋ค.
useEffect(() => {
const payload = {
channelId: item.snippet.channelId,
orderType: 'viewCount',
results: 15,
};
dispatch(getSearchVideos(payload));
}, []);
ํ์
์คํฌ๋ฆฝํธ๊ฐ ๋ง๋ฅ ์ต์ํ์ง ์๋ค ๋ณด๋ payload์ ํ์
์ ์ด๋ป๊ฒ ์ค ๊ฒ์ธ์ง ์ฝ์ง์ ๋ง์ด ํ๋ ๊ฒ ๊ฐ๋ค!..
ํ๋ก์ ํธ ์ค์ธ๋ฐ ๋ ๋ง์ ์๊ฐ์ ์์๋ถ์ง ์์ ๊ฒ์ด ๋คํ์ด๋ค. ๐
์ฐธ๊ณ ๊ธ
'๐ Studying > ๐ TIL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Next.js] Next.js ๊ธฐ๋ณธ ๊ฐ๋ (0) | 2023.01.31 |
---|---|
[TypeScript] ๊ฒ์ ๊ธฐ๋ฅ ๊ตฌํํ๊ธฐ (0) | 2023.01.27 |
[TypeScript] ๋ฆฌ์กํธ ํ์ด์ด๋ฒ ์ด์ค ์์ ๋ก๊ทธ์ธ ํธ์ํฐ ์ถ๊ฐํ๊ธฐ (1) | 2023.01.25 |
[TypeScript] ๋ก๊ทธ์ธ ์ฌ๋ถ์ ๋ฐ๋ฅธ ํค๋ ๋ณ๊ฒฝ์ ๋ํ ๊ณ ์ฐฐ (0) | 2023.01.24 |
[TypeScript] ๋ฆฌ์กํธ ํ์ ์คํฌ๋ฆฝํธ๋ก ํ๋ก์ ํธ ์์ํ๊ธฐ (0) | 2023.01.20 |
Comment