Si è corretto. È solo una funzione di aiuto per avere un modo più semplice di accedere alle proprietà del tuo stato
Immagina di avere una posts
chiave nella tua appstate.posts
state.posts //
/*
{
currentPostId: "",
isFetching: false,
allPosts: {}
}
*/
E componente Posts
Per impostazione predefinita connect()(Posts)
, tutti i puntelli di stato renderanno disponibile per il componente collegato
const Posts = ({posts}) => (
<div>
{/* access posts.isFetching, access posts.allPosts */}
</div>
)
Ora, quando mappi il state.posts
tuo componente, diventa un po 'più bello
const Posts = ({isFetching, allPosts}) => (
<div>
{/* access isFetching, allPosts directly */}
</div>
)
connect(
state => state.posts
)(Posts)
mapDispatchToProps
normalmente devi scrivere dispatch(anActionCreator())
con bindActionCreators
te puoi farlo anche più facilmente come
connect(
state => state.posts,
dispatch => bindActionCreators({fetchPosts, deletePost}, dispatch)
)(Posts)
Ora puoi usarlo nel tuo componente
const Posts = ({isFetching, allPosts, fetchPosts, deletePost }) => (
<div>
<button onClick={() => fetchPosts()} />Fetch posts</button>
{/* access isFetching, allPosts directly */}
</div>
)
Aggiornamento su actionCreators ..
Un esempio di actionCreator: deletePost
const deletePostAction = (id) => ({
action: 'DELETE_POST',
payload: { id },
})
Quindi, bindActionCreators
prenderai semplicemente le tue azioni e le avvolgerai dispatch
. (Non ho letto il codice sorgente di Redux, ma l'implementazione potrebbe essere simile a questa:
const bindActionCreators = (actions, dispatch) => {
return Object.keys(actions).reduce(actionsMap, actionNameInProps => {
actionsMap[actionNameInProps] = (...args) => dispatch(actions[actionNameInProps].call(null, ...args))
return actionsMap;
}, {})
}