Ho un problema quando si utilizza Redux thunk con il metodo connect()
da react-redux. Ho il seguente codice:Reagire Redux connect() con Redux thunk
function Component(props) {
return (
<button onClick={props.callback}>Click here</button>
);
}
function actionCreator() {
console.log('#1');
return dispatch => console.log('#2'); // = thunk
}
const mapDispatchToProps = dispatch => ({
callback: actionCreator
});
export const Container = connect(null, mapDispatchToProps)(Component);
Quando mi rendo componente Container
e cliccare sul pulsante, solo '# 1' viene visualizzato nella console. Quindi il 'thunk' non viene eseguito.
Quando la spedizione in modo esplicito actionCreator()
, funziona:
const mapDispatchToProps = dispatch => ({
callback: dispatch => dispatch(actionCreator())
});
The Redux docs says this about mapDispatchToProps:
Se viene passato un oggetto, ogni funzione all'interno di esso sarà assunto come un'azione creatore Redux
Quindi perché mapDispatchToProps non dispatch()
my actionCreator()
? Sono nuovo di React, quindi forse non lo capisco bene?
Aggiornamento
Quando si utilizza bindActionCreators()
da redux funziona:
const mapDispatchToProps = dispatch => {
return bindActionCreators({
callback: actionCreator
}, dispatch);
};
E 'questo il modo corretto di legarsi actioncreators con connect()
?
grazie per la risposta. Ho incluso redux-thunk come middleware nel mio negozio. Il tuo codice non funziona Invia l'actionCreator direttamente quando il componente si monta. Quando faccio clic sul pulsante viene visualizzato l'errore "this.props.callback non è una funzione" –
Hai ragione, ho trovato il vero problema ora. Cambia la funzione 'mapDispatchToProps' su ' const mapDispatchToProps = dispatch => ({callback:() => dispatch (actionCreator())}); ' e dovrebbe funzionare. Ho modificato la mia risposta sopra per riflettere e spiegare perché è necessario! – mxstbr
Grazie ancora. Il problema è che 'callback: dispatch => dispatch (actionCreator())' funziona davvero. Ma poi i param passati al 'callback()' (dal componente) non saranno passati in 'actionCreator()'. Ho trovato che 'bindActionCreators()' funziona per ora. –