Redux action factory не работает с аргументами - PullRequest
0 голосов
/ 06 сентября 2018

Я решил создать фабрики редукторов и действий, чтобы больше не повторять код. Заводской редуктор работает отлично. Это что-то вроде этого:

const initialState = {
  loading: false,
  error: null,
  data: [],
  entity: null,
  query: null
}

const baseReducer = (name = '') => {  
  return (state = initialState, action) => {
    switch(action.type) {
      case `FETCH_ALL_${name}_BEGIN`:
      case `FETCH_ONE_${name}_BEGIN`:
        return {
          ...state,
          loading: true
        }
      case `FETCH_ALL_${name}_ERROR`:
      case `FETCH_ONE_${name}_ERROR`:
        return {
          ...state,
          loading: false,
          error: action.payload.error
        }
      case `FETCH_ALL_${name}_SUCCESS`:            
        return {
          ...state,
          loading: false,
          data: action.payload.data
        }
      case `FETCH_ONE_${name}_SUCCESS`:
        return {
          ...state,
          loading: false,
          entity: action.payload.data
        }
      default:
        return state;
    }
  }
}

К сожалению, создатели действий не работают, если я передаю им аргументы. Вот моя реализация:

import axios from 'axios';

export const actionFactory = (name, action, thunk) => () => {    
  return dispatch => {
    console.log('this one here does not work');
    dispatch({
        type: `${action}_${name}_BEGIN`
      }
    );

    return dispatch(thunk)
      .then(response => {
        dispatch({
          type: `${action}_${name}_SUCCESS`,
          payload: {
            data: response.data
          }
        })
      })
      .catch(error => {
        dispatch({
          type: `${action}_${name}_FAILURE`,
          payload: {
            error: error.message
          }
        })
      });
  }
}

И это мои два действия. Первый работает нормально, а второй не достигает реализации фабрики действий. Я понятия не имею, почему это происходит, но это как-то связано с передачей аргументов.

export const fetchUsers = actionFactory('USERS', 'FETCH_ALL', () => {
    return axios.get('http://localhost:8000/api/user')
  });

export const fetchUser = (body) => actionFactory('USERS', 'FETCH_ONE', () => {
  return axios.get('http://localhost:8000/api/user/' + body);
})

Когда я вызываю их обоих в компоненте, первый возвращает всех пользователей, а второй вообще не запускается. Оператор Console.log не работает. Любые идеи, что я могу с этим поделать? Я устал от повторения кода, и, поскольку завод по производству редукторов работает, я бы не хотел оставлять его сейчас.

1 Ответ

0 голосов
/ 06 сентября 2018

Вы каррируете второй actionFactory (второй возвращает функцию при вызове).

Так что для первого fetchUsers () вполне подойдет.

Для второго вам нужно вызвать функцию, возвращаемую после передачи аргумента body. Это было бы:

fetchUser (корпус) ()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...