2017-01-24 4 views
1

У меня проблемы с редукцией. Это говорит, что отправка не является функцией внутри моего создателя действия, я пытался утешить возвращаемые аргументы и их нет.Redux-thunk - отправка не является функцией.

Здесь идет код:

Действие

export function signUp(data) { 
    return dispatch => { 
    console.log(dispatch) 
    if (data.email === '[email protected]') { 
     dispatch(signIn(data,() => { 
     if (data.type === '2') { 
      browserHistory.push('/settings/profile') 
     } else { 
      browserHistory.push('/') 
     } 
     })) 
    } else { 
     return { 
     type: ActionTypes.USER_SIGN_UP__ERROR 
     } 
    } 
    } 
}` 

mapActionsToProps

const mapActionsToProps = dispatch => ({ 
    signUp (data) { 
    console.log(dispatch) 
    dispatch(userActions.signUp(data)) 
    } 
}) 

Кстати, вы можете видеть, что я утешал функцию отправки внутри mapActionsToProps, и он возвращается, как и предполагалось:

function (action) { 
    if (typeof action === 'function') { 
     return action(dispatch, getState, extraArgument); 
    } 

    return next(action); 
    } 

ответ

1

Отправка не является функцией, потому что она не передается от создателя действия.

Кроме того, вы не должны отправлять какие-либо действия внутри своих картActionToProps. Вам просто нужно связать их, чтобы они были доступны подключенному компоненту.

Ваш mapActionsToProps

const mapActionsToProps = (dispatch) => { 
    return { 
    asyncAction: bindActionCreators(asyncAction, dispatch), 
    } 
} 

const Container = connect(mapStateToProps, mapActionsToProps)(Component); 

действие асинхронным

export const asyncAction = (email) => { 
    return (dispatch, getState) => { 

    const state = getState(); 

    dispatch(StartAsync()); 

    return fetch(`${apiUrl}/endpoint?email=${email}`, { 
     method: 'GET' 
    }) 
     .then(response => response.json()) 
     .then((result) => dispatch(finishedAsync(result)), 
       (error) => dispatch(failedAsync(error))) 
     .catch(e => { 
      console.log('error:', e); 
     }); 
    }; 
}; 

Тогда в подключенном компоненте, вы можете направить эту акцию от реквизита.

+0

На самом деле, согласно исходному коду редукции, отмечается, что 'Эта функция [bindActionCreators] - это просто метод удобства, так как вы можете называть« store.dispatch (MyActionCreators.doSomething()) «сами по себе». Кроме того, я не вижу никакой реальной разницы в нашей структуре кода, не получаю другие отличия? Спасибо. –

+0

Ты прав. Я просто использую bindActionCreators. Вы пытались вернуть свою функцию из 'mapActionsToProps'? – jdrzejb

+0

'константные mapDispatchToProps = отправка => { \t возврата { \t SIGNUP: (данные) => { \t отправка (userActions.signUp (данные)) \t} \t} \t}' – jdrzejb

Смежные вопросы