Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to refactor redux + thunk actions/constants

In my react/redux/thunk application I use actions like:

function catsRequested() {
    return {
        type: CATS_REQUESTED,
        payload: {},
    };
}

function catsReceived(landings) {
    return {
        type: CATS_RECEIVED,
        payload: landings,
    };
}

function catsFailed(error) {
    return {
        type: CATS_FAILED,
        payload: { error },
    };
}

export const fetchCats = () => ((dispatch, getState) => {
    dispatch(catsRequested());
    return catsAPI.loadCats()
        .then((cats) => {
            dispatch(catsReceived(cats));
        }, (e) => {
            dispatch(catsFailed(e.message));
        });
});

To deal with some data (simplified). Everything works but i have a lot of code for every data entity (and constants too). I mean same functions for dogs, tigers, birds etc...

I see there are similar requested/received/failed action/constant for every entity.

What is right way to minify code in terms of redux-thunk?

like image 839
Michael Plakhov Avatar asked Mar 07 '17 09:03

Michael Plakhov


People also ask

What are thunk action creators in Redux?

In the same way that Redux code normally uses action creators to generate action objects for dispatching instead of writing action objects by hand, we normally use thunk action creators to generate the thunk functions that are dispatched. A thunk action creator is a function that may have some arguments, and returns a new thunk function.

How do I dispatch a thunk function in Redux?

Dispatching thunk functions requires that the redux-thunk middleware has been added to the Redux store as part of its configuration. The Redux Toolkit configureStore API automatically adds the thunk middleware during store creation, so it should typically be available with no extra configuration needed.

How to update the state of a thunk action type?

The thunk action creator has the action creators for pending, fulfilled, and rejected attached. You can use the extraReducers option in createSlice to listen for those action types and update the slice's state accordingly. Redux Toolkit has a new RTK Query data fetching API.

When do you use Redux hooks in react?

Configuring thunk action creators and redux dev-tools with React’s use Reducer hook. When does someone choose to put a state in redux? To avoid props drilling. To use the redux state as a cache between mount/unmount.


1 Answers

You can keep your code DRY by creating a types and a thunk creators:

Type:

const createTypes = (type) => ({
    request: `${type}_REQUESTED`, 
    received: `${type}_RECEIVED`, 
    failed: `${type}_FAILED`, 
});

Thunk:

const thunkCreator = (apiCall, callTypes) => ((dispatch, getState) => {
    dispatch({ type: callTypes.request });

    return apiCall
        .then((payload) => {
            dispatch({ type: callTypes.received, payload }));
        }, (e) => {
            dispatch({ type: callTypes.failed, payload: e.message }));
        });
});

Now you can create a fetch method with 2 lines of code:

export const fetchCatsTypes = createTypes('CATS'); // create and export the constants
export const fetchCats = (catsAPI.loadCats, fetchCatsTypes); // create and export the thunk

export const fetchDogsTypes = createTypes('DOGS'); // create and export the constants
export const fetchDogs = (dogsAPI.loadDogs, fetchDogsTypes ); // create and export the thunk

Note: you'll also use the types constant (fetchDogsTypes) in the reducers.

like image 164
Ori Drori Avatar answered Sep 19 '22 21:09

Ori Drori