ใช่ถูกต้อง มันเป็นเพียงฟังก์ชั่นผู้ช่วยที่จะมีวิธีที่ง่ายกว่าในการเข้าถึงคุณสมบัติของรัฐ
ลองนึกภาพคุณมีposts
กุญแจในแอพของคุณstate.posts
state.posts //
/*
{
currentPostId: "",
isFetching: false,
allPosts: {}
}
*/
และส่วนประกอบ Posts
โดยค่าเริ่มต้นconnect()(Posts)
จะทำให้อุปกรณ์สถานะทั้งหมดพร้อมใช้งานสำหรับคอมโพเนนต์ที่เชื่อมต่อ
const Posts = ({posts}) => (
<div>
{/* access posts.isFetching, access posts.allPosts */}
</div>
)
ตอนนี้เมื่อคุณแมปstate.posts
องค์ประกอบของคุณมันจะดีขึ้นเล็กน้อย
const Posts = ({isFetching, allPosts}) => (
<div>
{/* access isFetching, allPosts directly */}
</div>
)
connect(
state => state.posts
)(Posts)
mapDispatchToProps
โดยปกติคุณต้องเขียน dispatch(anActionCreator())
ด้วยbindActionCreators
คุณสามารถทำมันได้ง่ายขึ้นเช่นกัน
connect(
state => state.posts,
dispatch => bindActionCreators({fetchPosts, deletePost}, dispatch)
)(Posts)
ตอนนี้คุณสามารถใช้มันในชิ้นส่วนของคุณ
const Posts = ({isFetching, allPosts, fetchPosts, deletePost }) => (
<div>
<button onClick={() => fetchPosts()} />Fetch posts</button>
{/* access isFetching, allPosts directly */}
</div>
)
อัปเดตเกี่ยวกับ actionCreators ..
ตัวอย่างของ actionCreator: deletePost
const deletePostAction = (id) => ({
action: 'DELETE_POST',
payload: { id },
})
ดังนั้นbindActionCreators
เพียงแค่จะดำเนินการของคุณห่อพวกเขาในการdispatch
โทร (ฉันไม่ได้อ่านซอร์สโค้ดของ redux แต่การนำไปใช้อาจมีลักษณะดังนี้:
const bindActionCreators = (actions, dispatch) => {
return Object.keys(actions).reduce(actionsMap, actionNameInProps => {
actionsMap[actionNameInProps] = (...args) => dispatch(actions[actionNameInProps].call(null, ...args))
return actionsMap;
}, {})
}