Ada beberapa pendapat berbeda tentang apakah mengakses negara dalam pembuat tindakan adalah ide yang baik:
- Pencipta Redux Dan Abramov merasa bahwa itu harus dibatasi: "Beberapa kasus penggunaan di mana saya pikir itu dapat diterima adalah untuk memeriksa data yang di-cache sebelum Anda membuat permintaan, atau untuk memeriksa apakah Anda diautentikasi (dengan kata lain, melakukan pengiriman bersyarat). Saya pikir menyampaikan data seperti
state.something.items
dalam pembuat tindakan jelas merupakan pola-anti dan tidak disarankan karena mengaburkan riwayat perubahan: jika ada bug dan items
tidak benar, sulit untuk melacak dari mana nilai-nilai yang salah berasal karena mereka sudah menjadi bagian dari tindakan, daripada langsung dihitung oleh peredam dalam menanggapi suatu tindakan. Jadi lakukan ini dengan hati-hati. "
- Pemelihara Redux saat ini, Mark Erikson, mengatakan tidak apa-apa dan bahkan dianjurkan untuk menggunakannya
getState
di thunks - karena itulah ia ada . Dia membahas pro dan kontra dari mengakses negara dalam tindakan pencipta di posting blognya Idiomatic Redux: Pikiran pada Thunks, Sagas, Abstraction, dan Reusability .
Jika Anda merasa perlu ini, kedua pendekatan yang Anda sarankan baik-baik saja. Pendekatan pertama tidak memerlukan middleware:
import store from '../store';
export const SOME_ACTION = 'SOME_ACTION';
export function someAction() {
return {
type: SOME_ACTION,
items: store.getState().otherReducer.items,
}
}
Namun Anda dapat melihat bahwa itu bergantung pada store
ekspor tunggal dari beberapa modul. Kami tidak menyarankan hal itu karena akan lebih sulit untuk menambahkan rendering server ke aplikasi Anda karena dalam kebanyakan kasus di server Anda ingin memiliki toko terpisah per permintaan . Jadi, sementara secara teknis pendekatan ini berhasil, kami tidak menyarankan mengekspor toko dari modul.
Inilah mengapa kami merekomendasikan pendekatan kedua:
export const SOME_ACTION = 'SOME_ACTION';
export function someAction() {
return (dispatch, getState) => {
const {items} = getState().otherReducer;
dispatch(anotherAction(items));
}
}
Ini mengharuskan Anda untuk menggunakan Redux Thunk middleware tetapi berfungsi dengan baik pada klien dan di server. Anda dapat membaca lebih lanjut tentang Redux Thunk dan mengapa perlu dalam kasus ini di sini .
Idealnya, tindakan Anda tidak boleh "gemuk" dan harus mengandung informasi sesedikit mungkin, tetapi Anda harus merasa bebas untuk melakukan apa yang terbaik untuk Anda dalam aplikasi Anda sendiri. Redux FAQ memiliki informasi tentang logika pemisahan antara pembuat tindakan dan reduksi dan waktu di mana mungkin berguna untuk digunakan getState
dalam pembuat tindakan .
getState
Ketika skenario Anda sederhana, Anda dapat menggunakannya
Namun terkadang Anda
action creator
perlu memicu multi aksimisalnya permintaan async sehingga Anda perlu
REQUEST_LOAD
REQUEST_LOAD_SUCCESS
REQUEST_LOAD_FAIL
tindakanCatatan: Anda perlu redux-thunk untuk mengembalikan fungsi di pembuat tindakan
sumber
loading === true
ada dan menonaktifkan tombol.Saya setuju dengan @Bloomca. Melewati nilai yang dibutuhkan dari toko ke fungsi pengiriman sebagai argumen tampaknya lebih sederhana daripada mengekspor toko. Saya membuat contoh di sini:
sumber
Saya ingin menunjukkan bahwa tidak terlalu buruk untuk membaca dari toko - mungkin lebih nyaman untuk memutuskan apa yang harus dilakukan berdasarkan pada toko, daripada menyerahkan semuanya ke komponen dan kemudian sebagai parameter dari sebuah fungsi. Saya setuju dengan Dan sepenuhnya, bahwa jauh lebih baik untuk tidak menggunakan store sebagai singletone, kecuali jika Anda 100% yakin bahwa Anda hanya akan menggunakan rendering di sisi klien (jika tidak, bug yang sulit dilacak akan muncul).
Saya telah membuat perpustakaan baru-baru ini untuk menangani verbositas redux, dan saya pikir itu ide yang baik untuk meletakkan segala sesuatu di middleware, sehingga Anda memiliki semuanya sebagai suntikan ketergantungan.
Jadi, contoh Anda akan terlihat seperti itu:
Namun, seperti yang Anda lihat, kami tidak benar-benar mengubah data di sini, jadi ada peluang bagus bahwa kami bisa menggunakan pemilih ini di tempat lain untuk menggabungkannya di tempat lain.
sumber
Menghadirkan cara alternatif untuk menyelesaikan ini. Ini mungkin lebih baik atau lebih buruk daripada solusi Dan, tergantung pada aplikasi Anda.
Anda bisa memasukkan status dari reduksi ke tindakan dengan membagi aksi dalam 2 fungsi terpisah: pertama meminta data, tindakan kedua pada data. Anda dapat melakukannya dengan menggunakan
redux-loop
.Pertama, silakan minta datanya.
Di reducer, potong tanda tanya dan berikan data ke tindakan tahap kedua dengan menggunakan
redux-loop
.Dengan data di tangan, lakukan apa pun yang awalnya Anda inginkan
Semoga ini bisa membantu seseorang.
sumber
Saya tahu saya terlambat ke pesta di sini, tetapi saya datang ke sini untuk pendapat tentang keinginan saya sendiri untuk menggunakan negara dalam tindakan, dan kemudian membentuk saya sendiri, ketika saya menyadari apa yang saya pikir adalah perilaku yang benar.
Di sinilah pemilih paling masuk akal bagi saya. Komponen Anda yang mengeluarkan permintaan ini harus diberi tahu apakah saatnya untuk mengeluarkannya melalui seleksi.
Mungkin terasa seperti abstraksi yang bocor, tetapi komponen Anda jelas perlu mengirim pesan dan muatan pesan harus berisi status terkait. Sayangnya pertanyaan Anda tidak memiliki contoh konkret karena kami dapat bekerja melalui 'model yang lebih baik' dari penyeleksi dan tindakan seperti itu.
sumber
Saya ingin menyarankan alternatif lain yang saya temukan terbersih, tetapi membutuhkan
react-redux
atau sesuatu yang simular - juga saya menggunakan beberapa fitur mewah lainnya di sepanjang jalan:Jika Anda ingin menggunakan kembali ini, Anda harus mengekstrak spesifik
mapState
,mapDispatch
danmergeProps
ke dalam fungsi untuk menggunakan kembali di tempat lain, tetapi ini membuat ketergantungan sangat jelas.sumber