Je suis un débutant javascript / redux / react qui crée une petite application avec redux, react-redux et react. Pour une raison quelconque, lors de l'utilisation de la fonction mapDispatchToProps en tandem avec connect (liaison react-redux), je reçois un TypeError indiquant que la répartition n'est pas une fonction lorsque j'essaie d'exécuter le prop résultant. Cependant, quand j'appelle dispatch comme accessoire (voir la fonction setAddr dans le code fourni), cela fonctionne.
Je suis curieux de savoir pourquoi, dans l'exemple d'application TODO dans la documentation redux, la méthode mapDispatchToProps est configurée de la même manière. Quand je console.log (dispatch) à l'intérieur de la fonction, il dit que la répartition est un objet de type. Je pourrais continuer à utiliser la répartition de cette façon, mais je me sentirais mieux de savoir pourquoi cela se produit avant de continuer avec redux. J'utilise webpack avec des chargeurs babel pour compiler.
Mon code:
import React, { PropTypes, Component } from 'react';
import { connect } from 'react-redux';
import { setAddresses } from '../actions.js';
import GeoCode from './geoCode.js';
import FlatButton from 'material-ui/lib/flat-button';
const Start = React.createClass({
propTypes: {
onSubmit: PropTypes.func.isRequired
},
setAddr: function(){
this.props.dispatch(
setAddresses({
pickup: this.refs.pickup.state.address,
dropoff: this.refs.dropoff.state.address
})
)
},
render: function() {
return (
<div>
<div className="row">
<div className="col-xs-6">
<GeoCode ref='pickup' />
</div>
<div className="col-xs-6">
<GeoCode ref='dropoff' />
</div>
</div>
<div className="row">
<div className="col-xs-6">
<FlatButton
label='Does Not Work'
onClick={this.props.onSubmit({
pickup: this.refs.pickup.state.address,
dropoff: this.refs.dropoff.state.address
})}
/>
</div>
<div className="col-xs-6">
<FlatButton
label='Works'
onClick={this.setAddr}
/>
</div>
</div>
</div>
);
}
})
const mapDispatchToProps = (dispatch) => {
return {
onSubmit: (data) => {
dispatch(setAddresses(data))
}
}
}
const StartContainer = connect(mapDispatchToProps)(Start)
export default StartContainer
À votre santé.
la source
Réponses:
Si vous souhaitez utiliser
mapDispatchToProps
sansmapStateToProps
utiliser justenull
pour le premier argument.export default connect(null, mapDispatchToProps)(Start)
la source
mapDispatchToProps
, n'ajoutez pas cet argument àconnect
:connect(mapStateToProps)(MyComponent)
Il vous manque juste le premier argument de
connect
, qui est lamapStateToProps
méthode. Extrait de l'application Redux todo:la source
Utilisation
au lieu de
la source
Je l'ai résolu en interchangeant les arguments, j'utilisais
ce qui est faux. Le
mapStateToProps
doit être le premier argument:Cela semble évident maintenant, mais pourrait aider quelqu'un.
la source
J'avais besoin d'un exemple d'utilisation
React.Component
alors je le poste:la source
Problème
Voici quelques points à noter pour comprendre le comportement du composant connecté dans votre code:
L'arité des
connect
choses:connect(mapStateToProps, mapDispatchToProps)
React-Redux appelle
connect
avec le premier argumentmapStateToProps
et le second argumentmapDispatchToProps
.Par conséquent, bien que vous ayez transmis votre
mapDispatchToProps
, React-Redux traite en fait cela commemapState
parce que c'est le premier argument. Vous obtenez toujours laonSubmit
fonction injectée dans votre composant car le retour demapState
est fusionné dans les accessoires de votre composant. Mais ce n'est pas comme ça qu'onmapDispatch
est censé être injecté.Vous pouvez utiliser
mapDispatch
sans définirmapState
. Passez à lanull
place demapState
et votre composant ne sera pas soumis à des modifications de stockage.Le composant connecté reçoit
dispatch
par défaut, quand aucunmapDispatch
n'est fourniDe plus, votre composant reçoit
dispatch
car il a reçunull
sa deuxième position pourmapDispatch
. Si vous passez correctementmapDispatch
, votre composant ne recevra pasdispatch
.Pratique courante
Ce qui précède explique pourquoi le composant s'est comporté de cette façon. Cependant, il est courant que vous passiez simplement votre créateur d'action en utilisant
mapStateToProps
la sténographie d'objet de. Et appelez cela dans votre composantonSubmit
C'est -à -dire:la source
Lorsque vous ne fournissez pas
mapDispatchToProps
un deuxième argument, comme ceci:alors vous obtenez automatiquement l'envoi aux accessoires du composant, vous pouvez donc simplement:
sans aucune mapDispatchToProps
la source
J'utilise comme ça .. son premier argument facile à comprendre est mapStateToProps et le second argument est mapDispatchToProps à la fin se connecter avec la fonction / classe.
la source
Parfois, cette erreur se produit également lorsque vous modifiez l'ordre de la fonction du composant lors de la connexion.
Ordre incorrect:
Bon ordre:
la source
Un écueil dans lequel certains pourraient tomber est couvert par cette question mais n'est pas abordé dans les réponses car il est légèrement différent dans la structure du code mais renvoie exactement la même erreur.
Cette erreur se produit lors de l'utilisation
bindActionCreators
et de la non-transmission de ladispatch
fonctionCode d'erreur
Code fixe
La fonction
dispatch
était manquante dans le code d'erreurla source
La fonction 'connect' de React-redux accepte deux arguments, le premier est mapStateToProps et le second est mapDispatchToProps, vérifiez ci-dessous ex.
export default connect(mapStateToProps, mapDispatchToProps)(Index);
»Si nous ne voulons pas récupérer l'état de redux, nous définissons null au lieu de mapStateToProps.
export default connect(null, mapDispatchToProps)(Index);
la source