Katakanlah saya memiliki toggle sederhana:
Saat saya mengklik tombol, komponen Color berubah antara merah dan biru
Saya mungkin mencapai hasil ini dengan melakukan sesuatu seperti ini.
index.js
Button: onClick={()=>{dispatch(changeColor())}}
Color: this.props.color ? blue : red
container.js
connect(mapStateToProps)(indexPage)
action_creator.js
function changeColor(){
return {type: 'CHANGE_COLOR'}
}
reducer.js
switch(){
case 'CHANGE_COLOR':
return {color: true}
tetapi ini adalah banyak sekali kode untuk ditulis untuk sesuatu yang bisa saya capai dalam 5 detik dengan jQuery, beberapa kelas, dan beberapa css ...
Jadi saya rasa yang sebenarnya saya tanyakan adalah, apa yang salah saya lakukan di sini?
javascript
reactjs
redux
l2silver
sumber
sumber
Jawaban:
Redux terutama ditujukan untuk "status aplikasi". Artinya, apa pun yang terkait dengan logika aplikasi Anda. Tampilan yang dibangun di atasnya adalah cerminan dari status tersebut, tetapi tidak harus secara eksklusif menggunakan penampung status tersebut untuk semua yang dilakukannya.
Ajukan saja pertanyaan-pertanyaan ini: Apakah status ini penting untuk aplikasi lainnya? Akankah bagian lain dari aplikasi berperilaku berbeda berdasarkan status itu? Dalam banyak kasus kecil, bukan itu masalahnya. Ambil menu tarik-turun: Fakta bahwa itu buka atau tutup mungkin tidak akan berpengaruh pada bagian lain dari aplikasi. Jadi, menghubungkannya ke toko Anda mungkin berlebihan. Ini tentu saja merupakan opsi yang valid, tetapi tidak benar-benar memberi Anda keuntungan apa pun. Anda lebih baik menggunakan
this.state
dan menyebutnya sehari.Dalam contoh khusus Anda, apakah warna tombol itu diubah untuk membuat perbedaan di bagian lain aplikasi? Jika itu semacam toggle hidup / mati global untuk sebagian besar aplikasi Anda, itu pasti milik toko. Tetapi jika Anda hanya mengubah warna tombol saat mengklik tombol, Anda dapat membiarkan status warna ditentukan secara lokal. Tindakan mengklik tombol mungkin memiliki efek lain yang memerlukan pengiriman tindakan, tetapi itu terpisah dari pertanyaan sederhana tentang warna apa yang seharusnya.
Secara umum, cobalah untuk menjaga status aplikasi Anda sekecil mungkin. Anda tidak harus mendorong semua yang ada di sana. Lakukan ketika Anda harus atau sangat masuk akal untuk menyimpan sesuatu di sana. Atau jika itu membuat hidup Anda lebih mudah saat menggunakan Dev Tools. Tapi jangan terlalu membebani kepentingannya.
sumber
FAQ Redux: Status Pengorganisasian
, bagian dari dokumen resmi redux ini menjawab pertanyaan Anda dengan baik.
sumber
Untuk tujuan menyoroti tautan bagus yang disediakan oleh @ AR7, dan karena tautan itu dipindahkan beberapa waktu lalu:
sumber
Ya, ada baiknya berusaha menyimpan semua status komponen di Redux . Jika Anda melakukannya, Anda akan mendapatkan keuntungan dari banyak fitur Redux seperti debugging perjalanan waktu dan laporan bug yang dapat diputar ulang. Jika tidak, fitur tersebut mungkin tidak dapat digunakan sepenuhnya .
Setiap kali Anda tidak menyimpan perubahan status komponen di Redux, perubahan itu benar-benar hilang dari tumpukan perubahan Redux dan UI aplikasi Anda tidak akan sinkron dengan penyimpanan. Jika ini tidak penting bagi Anda, tanyakan pada diri Anda mengapa menggunakan Redux? Aplikasi Anda tidak akan terlalu rumit tanpanya!
Untuk alasan kinerja, Anda mungkin ingin kembali ke
this.setState()
apa pun yang akan mengirimkan banyak tindakan berulang kali. Misalnya: menyimpan status kolom input di Redux setiap kali pengguna mengetik kunci dapat mengakibatkan performa yang buruk. Anda dapat menyelesaikan ini dengan memperlakukannya seperti transaksi: setelah tindakan pengguna "dilakukan", simpan status akhir di Redux.Posting asli Anda menyebutkan bagaimana cara Redux adalah "sangat banyak kode untuk ditulis". Ya, tetapi Anda dapat menggunakan abstraksi untuk pola umum seperti status komponen lokal.
sumber
this.setState()
ataudispatch(action...)
. Seseorang tidak perlu menggunakan dithis.setState()
mana-mana tetapi ketika Anda perlu, saran saya adalah menggunakan Redux sebagai gantinya untuk 99% kasus, kembali kethis.setState()
1% berdasarkan masalah kinerja.