Vâng, đúng rồi. Đây chỉ là một chức năng của trình trợ giúp để có cách đơn giản hơn để truy cập các thuộc tính trạng thái của bạn
Hãy tưởng tượng bạn có một postschìa khóa trong Ứng dụng của bạnstate.posts
state.posts //
/*
{
currentPostId: "",
isFetching: false,
allPosts: {}
}
*/
Và thành phần Posts
Theo mặc định connect()(Posts)sẽ làm cho tất cả các đạo cụ trạng thái có sẵn cho Thành phần được kết nối
const Posts = ({posts}) => (
<div>
{/* access posts.isFetching, access posts.allPosts */}
</div>
)
Bây giờ khi bạn ánh xạ state.poststhành phần của bạn, nó sẽ đẹp hơn một chút
const Posts = ({isFetching, allPosts}) => (
<div>
{/* access isFetching, allPosts directly */}
</div>
)
connect(
state => state.posts
)(Posts)
mapDispatchToProps
bình thường bạn phải viết dispatch(anActionCreator())
với bindActionCreatorsbạn có thể làm điều đó cũng dễ dàng hơn như
connect(
state => state.posts,
dispatch => bindActionCreators({fetchPosts, deletePost}, dispatch)
)(Posts)
Bây giờ bạn có thể sử dụng nó trong Thành phần của bạn
const Posts = ({isFetching, allPosts, fetchPosts, deletePost }) => (
<div>
<button onClick={() => fetchPosts()} />Fetch posts</button>
{/* access isFetching, allPosts directly */}
</div>
)
Cập nhật trên ActionCreators ..
Một ví dụ về ActionCreator: deletePost
const deletePostAction = (id) => ({
action: 'DELETE_POST',
payload: { id },
})
Vì vậy, bindActionCreatorssẽ chỉ thực hiện hành động của bạn, bọc chúng vào dispatchcuộc gọi. (Tôi đã không đọc mã nguồn của redux, nhưng việc triển khai có thể trông giống như thế này:
const bindActionCreators = (actions, dispatch) => {
return Object.keys(actions).reduce(actionsMap, actionNameInProps => {
actionsMap[actionNameInProps] = (...args) => dispatch(actions[actionNameInProps].call(null, ...args))
return actionsMap;
}, {})
}