Saya merasa tidak ada jawaban yang mengkristal mengapa mapDispatchToProps
berguna.
Ini benar-benar hanya dapat dijawab dalam konteks container-component
pola, yang saya temukan paling baik dipahami dengan membaca pertama: Komponen Kontainer kemudian Penggunaan dengan Bereaksi .
Singkatnya, Anda components
seharusnya 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" component
dalam 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 mapDispatchToProps
masuk: 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 component
pola,, FancyAlerter
yang melakukan rendering tidak perlu tahu tentang hal-hal itu: ia mendapatkan metodenya untuk memanggil onClick
tombol, melalui alat peraga.
Dan ... mapDispatchToProps
adalah 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 mapStateToProps
untuk tujuan yang sama seperti mapDispatchToProps
untuk alasan dasar bahwa Anda tidak memiliki akses ke dispatch
dalam mapStateToProp
. Jadi, Anda tidak dapat menggunakan mapStateToProps
metode 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
ALERT_ACTION
apakah fungsi tindakan atautype
yang dikembalikan dari fungsi tindakan? : / so baffedIni pada dasarnya sebuah steno. Jadi alih-alih harus menulis:
Anda akan menggunakan mapDispatchToProps seperti yang ditunjukkan dalam kode contoh Anda, dan kemudian menulis di tempat lain:
atau lebih mungkin dalam hal ini, Anda akan memilikinya sebagai pengendali acara:
Ada video bermanfaat oleh Dan Abramov tentang ini di sini: https://egghead.io/lessons/javascript-redux-generating-containers-with-connect-from-react-redux-visibletodolist
sumber
mapDispatch
fungsi Anda sendiri , Redux akan menggunakan default.mapDispatch
Fungsi default itu hanya mengambildispatch
referensi fungsi, dan memberikannya kepada Anda sebagaithis.props.dispatch
.mapStateToProps()
adalah utilitas yang membantu komponen Anda mendapatkan status yang diperbarui (yang diperbarui oleh beberapa komponen lain),mapDispatchToProps()
adalah utilitas yang akan membantu komponen Anda untuk memecat suatu peristiwa aksi (tindakan pengiriman yang dapat menyebabkan perubahan status aplikasi)sumber
mapStateToProps
,mapDispatchToProps
danconnect
darireact-redux
perpustakaan menyediakan cara mudah untuk mengaksesstate
dandispatch
fungsi toko Anda. Jadi pada dasarnya terhubung adalah komponen urutan yang lebih tinggi, Anda juga dapat berpikir sebagai pembungkus jika ini masuk akal untuk Anda. Jadi setiap kali Andastate
diubahmapStateToProps
akan dipanggil dengan yang barustate
dan selanjutnya saat Andaprops
memperbarui komponen akan menjalankan fungsi render untuk merender komponen Anda di browser.mapDispatchToProps
juga menyimpan nilai-nilai kunci padaprops
komponen Anda, biasanya mereka mengambil bentuk fungsi. Sedemikian rupa Anda dapat memicustate
perubahan dari komponen AndaonClick
,onChange
acara.Dari dokumen:
Juga pastikan bahwa Anda terbiasa dengan Bereaksi fungsi stateless dan Komponen Orde Tinggi
sumber
mapStateToProps
menerimastate
danprops
dan memungkinkan Anda untuk mengekstrak alat peraga dari negara bagian untuk lolos ke komponen.mapDispatchToProps
menerimadispatch
danprops
dan dimaksudkan bagi Anda untuk mengikat pembuat tindakan untuk dikirim sehingga ketika Anda menjalankan fungsi yang dihasilkan tindakan akan dikirim.Saya menemukan ini hanya menyelamatkan Anda dari keharusan melakukan
dispatch(actionCreator())
dalam komponen Anda sehingga membuatnya sedikit lebih mudah dibaca.https://github.com/reactjs/react-redux/blob/master/docs/api.md#arguments
sumber
dispatch
metodenya? Dari mana asalnya?<Provider/>
dirinya sendiri. Itu melakukan sihir komponen tingkat tinggi sendiri untuk menjamin bahwa pengiriman tersedia di komponen anak-anaknya.Sekarang anggaplah ada tindakan untuk redux sebagai:
Ketika Anda mengimpornya,
Seperti nama fungsi mengatakan
mapDispatchToProps()
,dispatch
tindakan peta untuk alat peraga (alat peraga komponen kami)Jadi prop
onTodoClick
adalah kuncimapDispatchToProps
fungsi yang selanjutnya didelegasikan untuk mengirim tindakanaddTodo
.Juga jika Anda ingin memangkas kode dan memotong implementasi manual, maka Anda dapat melakukan ini,
Yang persis berarti
sumber