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 posts
chì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.posts
thà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 bindActionCreators
bạ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, bindActionCreators
sẽ chỉ thực hiện hành động của bạn, bọc chúng vào dispatch
cuộ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;
}, {})
}