Реагировать с редукцией через thunk - getState не является функцией

В настоящее время я получаю сообщение об ошибке TypeError: getState не является функцией. Я пытаюсь выполнить что-то похожее на пример на http://redux.js.org/docs/advanced/AsyncActions.html

action.js - здесь возникает ошибка

export const fetchCategoriesIfNeeded = (dispatch, getState) => {
    if(shouldFetchCategories(getState())){
        return dispatch(fetchCategories())
    }
}

App.js

  componentDidMount(){
    this.props.dispatch(fetchCategoriesIfNeeded())
  }

...

const mapStateToProps = (state, props) => {
  return {
    isFetching: state.isFetching,
    categories: state.categories
    }
}

reducer.js

function data (state = initialState, action){
    switch(action.type){
        case RECEIVE_CATEGORIES:
            return {
                ...state,
                isFetching: false,
                categories: action.categories
            }
        case REQUEST_CATEGORIES:
            return {
                ...state,
                isFetching: true
            }
        default:
            return state
    }
    return state
}

некоторые части кода пропущены для удобства чтения.

Я также попробовал это и получил TypeError: диспетчерская функция не является

export function fetchCategoriesIfNeeded(){
    return(dispatch, getState) =>{
        var state = getState()
        if(shouldFetchCategories(state)){
            dispatch(fetchCategories())
        }
    }
}

2 ответа

+ Изменить

export const fetchCategoriesIfNeeded = (dispatch, getState) => {

в

export const fetchCategoriesIfNeeded = () => (dispatch, getState) => {

Создатель вашего действия должен вернуть либо действие (или объект с type ключ) или функция (любезно предоставлен редукс-стук). Ваша подпись функции передала вам два параметра, dispatch а также getState в то время как сигнатура второй функции не принимает параметров, но функция возврата принимает dispatch а также getState, которые обеспечиваются приставкой-редуктором.

Вы также можете написать это, чтобы избежать путаницы

export const fetchCategoriesIfNeeded = () => {
    return (dispatch, getState) => {
       // Do stuff
    }
}

Надеюсь, это поможет!

Похоже, вы делаете что-то странное с тем, как вы вызываете рассылку.

Вы должны использовать mapDispatchToProps функция также.

например. что-то вроде этого:

const mapDispatchToProps = (dispatch, props) => {
   return {
       onUpdate: dispatch(fetchCategories())
    }
}


const mapStateToProps = (state, props) => {
  return {
    isFetching: state.isFetching,
    categories: state.categories
    }
}

а также:

  componentDidMount(){
    this.props.onUpdate(); 
  }
Другие вопросы по тегам