redux thunk


コメントドキュメント

紹介する

  • リッドが非同期タスクを処理する際に使用するミドルウェア
  • のアクションオブジェクトではなくdispatch関数を使用できます.
  • dispatch
  • 関数の場合、この関数はdispatchとgetStateをパラメータとして受け入れます.この関数を作成する関数はthunk
  • です.
    // thunk 함수 
    export const increaseAsync = () => (dispatch, getState) => {
      setTimeout(() => dispatch(increase()), 1000)
    }
    
    export const decreaseAsync = () => (dispatch, getState) => {
      setTimeout(() => dispatch(decrease()), 1000)
    }
    
  • 上のコードでは、thunkはインクリメントsync、インクリメントsync関数
  • である.
  • の2つのthunk関数は、dispatchとgetStateをパラメータとする関数を返します.
  • 設定

    npm install redux-thunk

    適用

  • redux-thunkを使用するには、ミドルウェアをショップに適用する必要があります.
  • //index.js
    다른건 생략...
    import ReduxThunk from 'redux-thunk';
    import { createStore, applyMiddleware } from 'redux';
    import { composeWithDevTools } from 'redux-devtools-extension';
    
    const store = createStore(
    	rootReducers, 
      	composeWithDevTools(applyMiddleware(ReduxThunk, logger))
    
    )
    
    
    ReactDOM.render(
      <Provider store={store}>
        <App />
      </Provider>,
      document.getElementById('root')
    );
    //counter.js
    // 액션 타입
    const INCREASE = 'INCREASE';
    const DECREASE = 'DECREASE';
    
    // 액션 생성 함수
    export const increase = () => ({ type: INCREASE });
    export const decrease = () => ({ type: DECREASE });
    
    // getState를 쓰지 않는다면 굳이 파라미터로 받아올 필요 없습니다.
    export const increaseAsync = () => dispatch => {
      setTimeout(() => dispatch(increase()), 1000);
    };
    export const decreaseAsync = () => dispatch => {
      setTimeout(() => dispatch(decrease()), 1000);
    };
    
    // 초깃값 (상태가 객체가 아니라 그냥 숫자여도 상관 없습니다.)
    const initialState = 0;
    
    export default function counter(state = initialState, action) {
      switch (action.type) {
        case INCREASE:
          return state + 1;
        case DECREASE:
          return state - 1;
        default:
          return state;
      }
    }
    //CounterContainer.js
    import React from 'react';
    import Counter from '../components/Counter';
    import { useSelector, useDispatch } from 'react-redux';
    import { increaseAsync, decreaseAsync } from '../modules/counter';
    
    function CounterContainer() {
      const number = useSelector(state => state.counter);
      const dispatch = useDispatch();
    
      const onIncrease = () => {
        dispatch(increaseAsync());
      };
     
      const onDecrease = () => {
        dispatch(decreaseAsync());
      };
    
      return (
        <Counter number={number} onIncrease={onIncrease} onDecrease={onDecrease} />
      );
    }
    
    export default CounterContainer;
  • 以上のコードCounterContainer.jsでは、increaseAsync()を呼び出すと関数が返されます.返される関数は、非同期呼び出しが完了した後にdispatch(increase())を呼び出す.
  • 勉強してから書く...