Saya seorang pemula javascript / redux / react membangun aplikasi kecil dengan redux, react-redux, & react. Untuk beberapa alasan saat menggunakan fungsi mapDispatchToProps bersama-sama dengan connect (react-redux binding) saya menerima TypeError yang menunjukkan bahwa pengiriman bukan fungsi ketika saya mencoba menjalankan prop yang dihasilkan. Namun, ketika saya memanggil dispatch sebagai prop (lihat fungsi setAddr di kode yang disediakan) itu berfungsi.
Saya ingin tahu mengapa ini terjadi, dalam contoh aplikasi TODO di redux, metode mapDispatchToProps disiapkan dengan cara yang sama. Ketika saya console.log (dispatch) di dalam fungsi itu dikatakan dispatch adalah tipe objek. Saya dapat terus menggunakan pengiriman dengan cara ini tetapi saya akan merasa lebih baik mengetahui mengapa ini terjadi sebelum saya melanjutkan lebih jauh dengan redux. Saya menggunakan webpack dengan babel-loader untuk dikompilasi.
Kode Saya:
import React, { PropTypes, Component } from 'react';
import { connect } from 'react-redux';
import { setAddresses } from '../actions.js';
import GeoCode from './geoCode.js';
import FlatButton from 'material-ui/lib/flat-button';
const Start = React.createClass({
propTypes: {
onSubmit: PropTypes.func.isRequired
},
setAddr: function(){
this.props.dispatch(
setAddresses({
pickup: this.refs.pickup.state.address,
dropoff: this.refs.dropoff.state.address
})
)
},
render: function() {
return (
<div>
<div className="row">
<div className="col-xs-6">
<GeoCode ref='pickup' />
</div>
<div className="col-xs-6">
<GeoCode ref='dropoff' />
</div>
</div>
<div className="row">
<div className="col-xs-6">
<FlatButton
label='Does Not Work'
onClick={this.props.onSubmit({
pickup: this.refs.pickup.state.address,
dropoff: this.refs.dropoff.state.address
})}
/>
</div>
<div className="col-xs-6">
<FlatButton
label='Works'
onClick={this.setAddr}
/>
</div>
</div>
</div>
);
}
})
const mapDispatchToProps = (dispatch) => {
return {
onSubmit: (data) => {
dispatch(setAddresses(data))
}
}
}
const StartContainer = connect(mapDispatchToProps)(Start)
export default StartContainer
Bersulang.
sumber
Jawaban:
Jika Anda ingin menggunakan
mapDispatchToProps
tanpamapStateToProps
menggunakannull
untuk argumen pertama.export default connect(null, mapDispatchToProps)(Start)
sumber
mapDispatchToProps
, jangan tambahkan argumen itu keconnect
:connect(mapStateToProps)(MyComponent)
Anda baru saja kehilangan argumen pertama
connect
, yaitumapStateToProps
metode. Kutipan dari aplikasi rencana Redux:sumber
Menggunakan
dari pada
sumber
Saya menyelesaikannya dengan menukar argumen, yang saya gunakan
mana yang salah. The
mapStateToProps
harus menjadi argumen pertama:Kedengarannya sudah jelas sekarang, tapi mungkin bisa membantu seseorang.
sumber
Saya membutuhkan contoh yang digunakan
React.Component
jadi saya mempostingnya:sumber
Isu
Berikut ini beberapa hal yang perlu diperhatikan untuk memahami perilaku komponen yang terhubung dalam kode Anda:
Arity of
connect
Matters:connect(mapStateToProps, mapDispatchToProps)
React-Redux memanggil
connect
dengan argumen pertamamapStateToProps
, dan argumen keduamapDispatchToProps
.Oleh karena itu, meskipun Anda telah mengirimkannya
mapDispatchToProps
, React-Redux pada kenyataannya memperlakukan itumapState
karena ini adalah argumen pertama. Anda masih mendapatkanonSubmit
fungsi yang diinjeksi di komponen Anda karena pengembalian darimapState
digabungkan ke dalam props komponen Anda. Tapi itu belum seberapamapDispatch
disuntikkan.Anda dapat menggunakan
mapDispatch
tanpa menentukanmapState
. Berikannull
menggantikanmapState
dan komponen Anda tidak akan mengalami perubahan penyimpanan.Komponen Terhubung Diterima
dispatch
secara Default, Ketika TidakmapDispatch
AdaJuga, komponen Anda menerima
dispatch
karena menerimanull
posisi kedua untukmapDispatch
. Jika Anda meneruskan dengan benarmapDispatch
, komponen Anda tidak akan menerimadispatch
.Praktek Umum
Jawaban di atas mengapa komponen berperilaku seperti itu. Meskipun, ini adalah praktik umum bahwa Anda hanya meneruskan pembuat tindakan Anda menggunakan
mapStateToProps
singkatan objek. Dan sebut itu di dalam komponen AndaonSubmit
yaitu:sumber
Jika Anda tidak memberikan
mapDispatchToProps
sebagai argumen kedua, seperti ini:maka Anda secara otomatis mendapatkan pengiriman ke props komponen, jadi Anda dapat:
tanpa mapDispatchToProps
sumber
saya menggunakan seperti ini .. yang mudah untuk memahami argumen pertama adalah mapStateToProps dan argumen kedua adalah mapDispatchToProps pada akhirnya terhubung dengan fungsi / kelas.
sumber
Kadang-kadang kesalahan ini juga terjadi ketika Anda mengubah urutan Fungsi Komponen saat lewat untuk menyambung.
Pesanan Salah:
Pesanan yang Benar:
sumber
Jebakan beberapa mungkin masuk yang tercakup oleh pertanyaan ini tetapi tidak dibahas dalam jawaban karena sedikit berbeda dalam struktur kode tetapi mengembalikan kesalahan yang sama persis.
Kesalahan ini terjadi saat menggunakan
bindActionCreators
dan tidak meneruskandispatch
fungsiKode Kesalahan
Kode Tetap
Fungsi
dispatch
tidak ada di kode Kesalahansumber
Fungsi 'connect' React-redux menerima dua argumen pertama adalah mapStateToProps dan kedua adalah cek mapDispatchToProps di bawah ex.
export default connect(mapStateToProps, mapDispatchToProps)(Index);
`Jika kami tidak ingin mengambil status dari redux maka kami menetapkan null alih-alih mapStateToProps.
export default connect(null, mapDispatchToProps)(Index);
sumber