ํฐ์คํ ๋ฆฌ ๋ทฐ
์ด์ ๊ธ์์ RTK์ ์ ์์ ์ธํ ํ๋ ๋ฐฉ๋ฒ์ ์ ๋ฆฌํ๋ค.
https://coco910.tistory.com/79
[Pokemon PJ_Day 4] RTK (1) - setting
ํ์ ๊ณผ์ ๋ฅผ ๋ง์น๊ณ ๋์ ๊ณผ์ ์ธ RTK๋ฅผ ์งํํ์๋ค. Context API๋ฅผ ์ฌ์ฉํ ๋ก์ง์์ RTK๋ก ๋ฐ๊พธ๋ ค๋ ํท๊ฐ๋ฆฌ๋ ๋ถ๋ถ์ด ๋ง์๋ค.ํฌ๊ฒ RTK๋ฅผ ์ธํ ํ๋ ๋ฐฉ๋ฒ๊ณผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ผ๋ก ์ ๋ฆฌํด๋ณด๊ฒ ๋ค.์ด๋ฒ ๊ธ์
coco910.tistory.com
์ด๋ฒ ๊ธ์์๋ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ!
RTK use
๐Redux 2๊ฐ์ง ํต์ฌ ๊ฐ๋ : useSelector, useDispatch
- useSelector : ํ์ฌ state์ ๊ฐ์ ์กฐํ
- useDispatch : state์ ๊ฐ์ ์ถ๊ฐ, ์ญ์ , ์์
๐์ต์ข ๋ชฉํ:
[dispatch์ action ๊ฐ์ฒด๋ฅผ ๋ด์์ reducer๋ฅผ ํตํด store์ ๋ณ๊ฒฝ๋ ๊ฐ ์ ๋ฌํ๊ธฐ]
๐์ฌ์ฉ ํ๋ฆ
1. ์ด๊ธฐ๊ฐ ์ค์
2. createSlice ์ ์
3. reducer ์ ์
3-1. reducer ๊ตฌ์ฑ
4. action ๊ฐ์ฒด๋ฅผ ์ค์ ์ฌ์ฉํ๋ ๊ณณ์ ์ ์ฉ
4-1. dispatch๋ฅผ ์ฌ์ฉํ ์ ์๋๋ก ์ ์
4-2. action์ด ์ผ์ด๋๋ ๋ฒํผ์ onClick ์์
5. useSelector๋ก ํ์ฌ state ๊ฐ ์กฐํ
1. ์ด๊ธฐ๊ฐ ์ค์
์ฐ์ slice์ ์ ์ํ ์ด๊ธฐ๊ฐ์ ์ด์ ์ ์์ฑํ useState์ ์ด๊ธฐ๊ฐ๊ณผ ๋์ผํ๋ค.
๋๋ [ ] ๋น ๋ฐฐ์ด๋ก ์ง์ ํ์ฌ ๋ค์ด์ค๋ ๊ฐ์ ๊ฐ์ฒด๋ก ๋ด์์ฃผ๊ณ ์์๋ค.
const initialState = [];
2. createSlice ์ ์
slice๋ name๊ณผ initialState, reducer๋ฅผ ๊ฐ๊ณ ์๋ค.
๊ทธ ์ค reducer๋ ์ด๋ค ์ก์ ์ ์ด๋ป๊ฒ ์๋ํ ์ง ์ ์ํด ๋๋ ํจ์์ด๋ค.
const monSlice = createSlice({
name: "setMyPokemon",
initialState,
reducers:{},
});
3. reducer ์ ์
๋ฆฌ๋์๋ state์ action์ ์ธ์๋ก ๊ฐ์ง๋ฉฐ state๋ฅผ ์ด๋ป๊ฒ ๋ณ๋์ํฌ์ง ํจ์๋ก ํํํ๋ค.
reducers: {
addPokemon: () => {},
deletePokemon: () => {},
};
3-1. reducer ๊ตฌ์ฑ
๋ณดํต state ๊ฐ์ฒด ๋ด๋ถ ์์์ ๊ฐ์ ์๋ก์ด ๊ฐ(action.payload)์ผ๋ก ๋ณ๊ฒฝํ๋ค.
ํ์ง๋ง, ๋๋ state๊ฐ [ ]์ด๊ธฐ ๋๋ฌธ์ ๋ฐฐ์ด ์์ 1๏ธโฃ์๋ก์ด ๊ฐ์ ์ถ๊ฐํ๊ฑฐ๋ 2๏ธโฃ์๋ก์ด ๋ฐฐ์ด๋ก ์ฌ์ ์ ํด์ผํ๋ค.
1๏ธโฃ์๋ก์ด ๊ฐ์ ์ถ๊ฐ(์ ํ)
- immer์์ ๋ฉ์๋๋ฅผ ์ด์ฉํ state ๋ณ๊ฒฝ์ ํ์ฉํ๋ค.
state.push(action.payload);
2๏ธโฃ์๋ก์ด ๋ฐฐ์ด๋ก ์ฌ์ ์
- ์ฌ์ ์ํ์ฌ state์ ์ฃผ์๊ฐ ๋ณ๊ฒฝ(setState์ ๊ฐ์ ์ญํ )
return [...state, action.payload];
[์ต์ข reducer]
reducers: {
addPokemon: (state, action) => {
state.push(action.payload);
},
deletePokemon: (state, action) => {
state.pop(action.payload);
},
},
4. action ๊ฐ์ฒด๋ฅผ ์ค์ ์ฌ์ฉํ๋ ๊ณณ์ ์ ์ฉํ๊ธฐ
4-1. PokemonCard.jsx ๋ก์ง ์๋จ์ dispatch๋ฅผ ์ฌ์ฉํ ์ ์๋๋ก ์ ์(import ํ์)
const dispatch = useDispatch();
4-2. action์ด ์ผ์ด๋๋ ๋ฒํผ์ onClick ์์
- () => {} : dispatch() (=์คํ ๊ฐ)์ด ์๋ ํจ์๋ก ์คํ
- addPokemon() : ์ฌ์ฉํ๋ reducer
- data : payload ๊ฐ (์ฌ๊ธฐ์๋ ํฌ์ผ๋ชฌ ํ๋์ ์ ๋ณด(๊ฐ์ฒด)
<AddBtn onClick={() => {dispatch(addPokemon(data))}}>์ถ๊ฐ</AddBtn>
์ญ์ ๋ก์ง๋ ๋ง์ฐฌ๊ฐ์ง๋ก ์งํํ์๋ค.
5. useSelector๋ก ํ์ฌ state ๊ฐ ์กฐํ
๋ค ๊ตฌ์ฑํ ์ค ์์๋๋ฐ dashboard์์ mapping ํ๋ ๋ฐฐ์ด์ด ์ ์๋์ง ์์๋ค๋ ์ค๋ฅ๊ฐ ๋ด๋ค.
๊ทธ ๋ฐฐ์ด์ myMon์ด๋ผ๋ ์ด๋ฆ์ผ๋ก state๊ฐ์ด๋ค.
ํ์ฌ state ๊ฐ์ ์กฐํํ๋ useSelector๋ฅผ ์ฌ์ฉํ์ฌ ์ค๋ฅ๋ฅผ ํด๊ฒฐํ๋ค.(๋ก์ง์ ์ตํ๋จ์)
์ด๋ก์จ RTK๋ก ๋ฆฌํฉํ ๋ง๋ ์ฑ๊ณต!
๐์ต์ข ๋ก์ง
[Store]
import { configureStore } from "@reduxjs/toolkit";
import monSliceReducer from "../slices/setMyPokemonSlice";
export const store = configureStore({
reducer: {
setMyPokemon: monSliceReducer, ๐๐ป๋ฆฌ๋์์ name: ๋ณ์(default๋ก exportํ๊ธฐ ๋๋ฌธ์ ์ด๋ค ๋ณ์๋ ๊ด์ฐฎ๋ค.)
},
});
[Slice]
import { createSlice } from "@reduxjs/toolkit";
const initialState = [];
const monSlice = createSlice({
name: "setMyPokemon",
initialState,
reducers: {
addPokemon: (state, action) => {
state.push(action.payload);
},
deletePokemon: (state, action) => {
state.pop(action.payload);
},
},
});
// action creater
export const { addPokemon, deletePokemon } = monSlice.actions;
// reducer
export default monSlice.reducer;
[Card] : ํ์ํ ๋ถ๋ถ๋ง ๋ฐ์ท
const PokemonCard = ({ isAdd, data }) => {
const dispatch = useDispatch();
const navigate = useNavigate();
return (
<MonCard
key={data.id}
onClick={(e) => {
{
navigate(`/detail?id=${data.id}`);
}
}}
>
<MonImg src={data.img_url} />
<BottomWrap>
<MonName>{data.korean_name}</MonName>
<p>No.{data.id}</p>
</BottomWrap>
{isAdd === true ? (
<AddBtn
className="add-card-btn"
onClick={() => {
dispatch(addPokemon(data));
}}
>
์ถ๊ฐ
</AddBtn>
) : (
<DeleteBtn
className="remove-card-btn"
onClick={() => {
dispatch(deletePokemon(data));
}}
>
์ญ์
</DeleteBtn>
)}
</MonCard>
);
};
export default PokemonCard;
[Dashboard] : ํ์ํ ๋ถ๋ถ๋ง ๋ฐ์ท
const Dashboard = () => {
const myMon = useSelector((a) => { ๐๐ป์ฝ๋ฐฑํจ์๋ฅผ ์ธ์๋ก ๊ฐ์ง, ์ฝ์์ ์ฐ์ด๋ณด๋ฉด store๊ฐ ๊ฐ์ง ๋ฆฌ๋์ ํํ ๊ทธ๋๋ก ๋์จ๋ค.
return a.setMyPokemon; ๐๐ป ๊ทธ ์ค ํ์ํ ๊ฐ์ ๊ฐ์ ธ์ค๊ธฐ
});'Language > React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [โ๏ธ] Tanstack Query(1) - useQuery, mutate, invalidateQueries (0) | 2025.03.08 |
|---|---|
| ์ฌ๊ธฐ์ state๋ฅผ ๊ตณ์ด? - ์ฌ๋ฆผํฝ ์ ๋ ฌ(sort) (0) | 2025.02.11 |
| [Pokemon PJ_Day 4] RTK (1) - ์ธํ ํ๊ธฐ (0) | 2025.02.06 |
| [โ๏ธ] Redux - counter ์ฑ ์์ฑ, redux ์ฌ์ดํด, dispatch (0) | 2025.02.03 |
| [โ๏ธ] Redux - ์๊ฐ ๋ฐ ์ค์ + counter ์ฑ ์ธํ (store ๋ง๋ค๊ธฐ) (0) | 2025.02.01 |