React - Thunk

Jinwoo Maยท2023๋…„ 11์›” 30์ผ

React

๋ชฉ๋ก ๋ณด๊ธฐ
14/17
post-thumbnail

Redux Thunk๋ž€?

  • ๋ฆฌ๋•์Šค์—์„œ ๋งŽ์ด ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ๋ฏธ๋“ค์›จ์–ด ์ค‘ ํ•˜๋‚˜์ด๋‹ค.
  • ๋ฏธ๋“ค์›จ์–ด : ๋ฆฌ๋•์Šค์—์„œ dispatch๋ฅผ ํ•˜๋ฉด action์ด ๋ฆฌ๋“€์„œ๋กœ ์ „๋‹ฌ ๋˜๊ณ , ๋ฆฌ๋“€์„œ๋Š” ์ƒˆ๋กœ์šด state๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๋ฏธ๋“ค์›จ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ด ๊ณผ์ • ์‚ฌ์ด์— ์šฐ๋ฆฌ๊ฐ€ ํ•˜๊ณ  ์‹ถ์€ ์ž‘์—…๋“ค์„ ๋„ฃ์–ด์„œ ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • Thunk๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์šฐ๋ฆฌ๊ฐ€ dispatch๋ฅผ ํ•  ๋•Œ ๊ฐ์ฒด๊ฐ€ ์•„๋‹Œ ํ•จ์ˆ˜๋ฅผ dispatch ํ•  ์ˆ˜ ์žˆ๋‹ค.

    dispatch(ํ•จ์ˆ˜) -> ํ•จ์ˆ˜์‹คํ–‰ -> ํ•จ์ˆ˜ ์•ˆ์—์„œ dispatch(๊ฐ์ฒด)

thunk ํ•จ์ˆ˜ ๊ตฌํ˜„ํ•˜๊ธฐ

3์ดˆ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” thunk ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•ด๋ณด์ž.
ํˆดํ‚ท์—์„  createAsyncThunk ๋ผ๋Š” API๋ฅผ ์‚ฌ์šฉํ•ด thunk ํ•จ์ˆ˜๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

export const __addNumber = createAsyncThunk(
	// ์ฒซ๋ฒˆ์งธ ์ธ์ž : action value
    "addNumber"
    // ๋‘๋ฒˆ์งธ ์ธ์ž : ์ฝœ๋ฐฑํ•จ์ˆ˜
    (payload, thunkAPI)=>{
    	setTimeout(()=>{
        	thunkAPI.dispatch(addNumber(payload));
            }, 3000);
    }
);
const counterSlice = createSlice({
    name: "counter",
    initialState,
    reducers: {
      addNumber: (state, action) => {
        state.number = state.number + action.payload;
      },

      minusNumber: (state, action) => {
        state.number = state.number - action.payload;
      },
    },
});
  • ์ „์—๋Š” addNumber๋ผ๋Š” action creator๋ฅผ dispatch ํ–ˆ๋‹ค๋ฉด, ์ด์ œ๋Š” __addNumber๋ผ๋Š” thunk ํ•จ์ˆ˜๋ฅผ dispatch ํ•ด์ค€๋‹ค.
// App.jsx
...
const onClickAddNumberHandler = () => {
	dispatch(__addNumber(number));
};
...

0๊ฐœ์˜ ๋Œ“๊ธ€