Saya merasa tidak ada jawaban yang mengkristal mengapa mapDispatchToPropsberguna.
Ini benar-benar hanya dapat dijawab dalam konteks container-componentpola, yang saya temukan paling baik dipahami dengan membaca pertama: Komponen Kontainer kemudian Penggunaan dengan Bereaksi .
Singkatnya, Anda componentsseharusnya hanya peduli dengan menampilkan barang-barang. Satu- satunya tempat mereka seharusnya mendapatkan informasi adalah alat peraga mereka .
Dipisahkan dari "menampilkan barang" (komponen) adalah:
- bagaimana Anda mendapatkan barang untuk ditampilkan,
- dan bagaimana Anda menangani acara.
Itu untuk apa containers.
Oleh karena itu, "dirancang dengan baik" componentdalam pola terlihat seperti ini:
class FancyAlerter extends Component {
sendAlert = () => {
this.props.sendTheAlert()
}
render() {
<div>
<h1>Today's Fancy Alert is {this.props.fancyInfo}</h1>
<Button onClick={sendAlert}/>
</div>
}
}
Lihat bagaimana komponen ini mendapat info ini akan menampilkan dari alat peraga (yang datang dari toko redux melalui mapStateToProps) dan juga mendapat fungsi aksinya dari alat peraga nya: sendTheAlert().
Di situlah mapDispatchToPropsmasuk: dalam yang sesuaicontainer
// FancyButtonContainer.js
function mapDispatchToProps(dispatch) {
return({
sendTheAlert: () => {dispatch(ALERT_ACTION)}
})
}
function mapStateToProps(state) {
return({fancyInfo: "Fancy this:" + state.currentFunnyString})
}
export const FancyButtonContainer = connect(
mapStateToProps, mapDispatchToProps)(
FancyAlerter
)
Aku ingin tahu apakah Anda bisa lihat, sekarang bahwa itu adalah container 1 yang tahu tentang redux dan pengiriman dan menyimpan dan negara dan ... hal.
Dalam componentpola,, FancyAlerteryang melakukan rendering tidak perlu tahu tentang hal-hal itu: ia mendapatkan metodenya untuk memanggil onClicktombol, melalui alat peraga.
Dan ... mapDispatchToPropsadalah alat yang berguna yang disediakan redux untuk membiarkan wadah dengan mudah melewatkan fungsi itu ke komponen terbungkus pada alat peraga.
Semua ini sangat mirip dengan contoh todo dalam dokumen, dan jawaban lain di sini, tetapi saya telah mencoba memberikannya pada pola untuk menekankan alasannya .
(Catatan: Anda tidak dapat menggunakan mapStateToPropsuntuk tujuan yang sama seperti mapDispatchToPropsuntuk alasan dasar bahwa Anda tidak memiliki akses ke dispatchdalam mapStateToProp. Jadi, Anda tidak dapat menggunakan mapStateToPropsmetode komponen yang digunakan komponen terbungkus dengan metode yang digunakan dispatch.
Saya tidak tahu mengapa mereka memilih untuk memecahnya menjadi dua fungsi pemetaan - mungkin lebih rapi untuk memiliki mapToProps(state, dispatch, props) IE satu fungsi untuk melakukan keduanya!
1 Catat bahwa saya sengaja menamakan wadah itu FancyButtonContainer, untuk menyoroti bahwa itu adalah "benda" - identitas (dan karenanya keberadaan!) Dari wadah itu sebagai "benda" kadang-kadang hilang di steno.
export default connect(...)
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
sintaks yang ditunjukkan dalam kebanyakan contoh