Oui, c'est correct. C'est juste une fonction d'aide pour avoir un moyen plus simple d'accéder à vos propriétés d'état.
Imaginez que vous avez un posts
dans votre application state.posts
state.posts //
/*
{
currentPostId: "",
isFetching: false,
allPosts: {}
}
*/
Et composant Posts
Par défaut connect()(Posts)
rendra tous les props d'état disponibles pour le composant connecté
const Posts = ({posts}) => (
<div>
{/* access posts.isFetching, access posts.allPosts */}
</div>
)
Maintenant, quand vous mettez en correspondance le state.posts
à votre composant il devient un peu plus agréable
const Posts = ({isFetching, allPosts}) => (
<div>
{/* access isFetching, allPosts directly */}
</div>
)
connect(
state => state.posts
)(Posts)
mapDispatchToProps
normalement, vous devez écrire dispatch(anActionCreator())
con bindActionCreators
vous pouvez aussi le faire plus facilement comme
connect(
state => state.posts,
dispatch => bindActionCreators({fetchPosts, deletePost}, dispatch)
)(Posts)
Vous pouvez maintenant l'utiliser dans votre composant
const Posts = ({isFetching, allPosts, fetchPosts, deletePost }) => (
<div>
<button onClick={() => fetchPosts()} />Fetch posts</button>
{/* access isFetching, allPosts directly */}
</div>
)
Mise à jour sur les créateurs d'action..
Un exemple d'un créateur d'action : deletePost
const deletePostAction = (id) => ({
action: 'DELETE_POST',
payload: { id },
})
Donc, bindActionCreators
va juste prendre vos actions, les envelopper dans dispatch
appel. (Je n'ai pas lu le code source de redux, mais l'implémentation pourrait ressembler à quelque chose comme ceci :
const bindActionCreators = (actions, dispatch) => {
return Object.keys(actions).reduce(actionsMap, actionNameInProps => {
actionsMap[actionNameInProps] = (...args) => dispatch(actions[actionNameInProps].call(null, ...args))
return actionsMap;
}, {})
}
17 votes
Je ne veux pas ajouter une autre réponse au mélange... mais je réalise que personne ne répond réellement à votre question... à mon avis, c'est PAS un anti-modèle. La clé est dans le nom mapStateTo. Props vous transmettez des propriétés en lecture seule pour un composant à consommer. J'utilise souvent mes composants conteneurs pour prendre l'état et le modifier avant de le transmettre au composant de présentation.
3 votes
De cette façon, mon élément de présentation est beaucoup plus simple... je pourrais rendre...
this.props.someData
à l'opposé dethis.props.someKey[someOtherKey].someData
... ont un sens ?7 votes
Ce tutoriel l'explique suffisamment bien : learn.co/lessons/map-state-to-props-readme
0 votes
Bonjour Pablo, veuillez reconsidérer la réponse que vous avez choisie.
0 votes
Reconsidérer comment ?
0 votes
@MatthewBrent Je pense que vous devriez créer une réponse pour que nous puissions discuter sous votre réponse. La partie la plus confuse de
mapStateToProps
pour moi, c'est que si j'ai un abonnement de données comme une partie de l'arbre d'état entier. Le sitemapStateToProps
continuera à calculer les props des composants non pertinents, lorsque l'état est modifié. Je sais que je peux utiliser la technologie memorize pour mettre en cache les calculs coûteux, mais j'espère que cela est géré automatiquement par redux lui-même. Est-ce que cela fait partie des anti-modèles à votre avis ?0 votes
Grâce à cette question, je comprends enfin comment Redux fonctionne avec react. Question vraiment bien posée.