Redux di antara kita
Ini adalah salah satu
manajer negara yang paling populer.
Mudah digunakan, transparan, dan dapat diprediksi. Dengannya, Anda dapat mengatur penyimpanan dan modifikasi data. Dan jika kita mengasumsikan bahwa
action `dan
reducer` adalah bagian dari
redux` a, maka kita dapat mengatakan tanpa berlebihan bahwa dia adalah pemegang semua logika area subjek (alias logika bisnis) dari aplikasi kita.
Apakah semuanya begitu cerah?
Untuk semua kesederhanaan dan transparansi, menggunakan
redux memiliki sejumlah kelemahan ...
Data dalam
keadaan `
redux` dan terletak di objek
javascript sederhana dan dapat diperoleh dengan cara biasa, Anda hanya perlu
tahu jalannya .
Tetapi bagaimana kita mengatur data ini? Hanya ada 2 opsi:
daftar datar dan
model hierarkis .
Daftar datar adalah pilihan yang bagus untuk aplikasi yang hanya ada, misalnya, penghitung ... Untuk sesuatu yang lebih serius, kita memerlukan struktur hierarkis. Selain itu, setiap level data akan memiliki lebih sedikit pengetahuan daripada yang sebelumnya. Semuanya logis dan dapat dimengerti, tetapi
jalur menuju data menjadi komposit .
Contohconst dataHierarchy = { user: { id, name, experience, achievements: { firstTraining, threeTrainingsInRow, }, }, training: { currentSetId, status, totalAttemptsCount, attemptsLeft, mechanics: { ... }, }, };
Di sini, di bawah kunci pengguna, data pengguna disimpan, dalam
pencapaian tertentu. Tetapi pencapaian tidak perlu tahu apa-apa tentang sisa data pengguna.
Dengan cara yang sama, mekanisme pelatihan tertentu tidak perlu tahu berapa banyak upaya yang ditinggalkan pengguna - ini adalah data pelatihan secara umum.
Kehadiran struktur data hierarkis dan kurangnya pendekatan modular untuk data ini mengarah pada fakta bahwa
di setiap tempat di mana data ini digunakan,
perlu untuk mengetahui jalur lengkap untuk itu. Dengan kata lain, ini menciptakan
kohesi struktur penyimpanan data dan struktur tampilan dan menyebabkan kesulitan dengan refactor jalur dan / atau reorganisasi struktur data.

Sihir IDE tidak akan membantuKita dapat mengatakan bahwa sekarang ada IDE yang kuat yang mengubah jalur dengan satu perintah, tetapi sedikit yang dapat mengubah beberapa kunci yang bersarang dari suatu objek atau memahami bahwa bagian dari jalur terletak pada variabel.
Tantangan lain adalah pengujian. Ya, ada artikel terpisah dalam dokumentasi untuk pengujian
redux , tetapi sekarang ini bukan tentang menguji artefak individu seperti
peredam dan pembuat
tindakan .
Data,
aksi , dan
peredam biasanya saling berhubungan. Dan satu pohon data yang berhubungan secara logis sering dilayani oleh beberapa
reduksi , yang perlu diuji termasuk bersama-sama.
Tambahkan ke daftar
pemilih ini , hasil yang tergantung khususnya pada karya
peredam ...
Secara umum, Anda dapat menguji semua ini, tetapi Anda harus berurusan dengan banyak artefak yang hanya saling terhubung oleh logika dan konvensi.
Dan bagaimana jika kita menemukan struktur, misalnya, dengan data pengguna, termasuk daftar teman, lagu favorit, dan yang lainnya, serta fungsi mengubahnya melalui
pengurang aksi . Mungkin kami bahkan menulis banyak tes untuk semua fungsi ini. Dan sekarang di proyek selanjutnya kita membutuhkan hal yang sama ...
Bagaimana cara membuat kode murah?Cari solusinya
Untuk mengetahui cara mempertahankan manfaat
redux dan menyingkirkan kelemahan yang dijelaskan, Anda harus memahami apa yang tergantung pada siklus hidup data:
- Acara melaporkan aksi , kebiasaan, dan lainnya
- Peredam bereaksi terhadap aksi dan mengubah atau tidak mengubah status data
- Perubahan data adalah peristiwa itu sendiri dan dapat menyebabkan data lain berubah.
Pengontrol dalam hal ini adalah abstraksi yang memproses tindakan pengguna dan perubahan data di
toko . Dia tidak harus menjadi kelas yang terpisah sama sekali, sebagai suatu peraturan, dia tersebar oleh komponen.
Gabungkan seluruh kebun binatang redux dalam kotak hitam
Tetapi bagaimana jika Anda membungkus
aksi ,
peredam dan
pemilih dalam satu modul dan mengajarkannya untuk tidak bergantung pada jalur spesifik untuk lokasi datanya?
Bagaimana jika semua tindakan
pengguna , misalnya, dilakukan dengan memanggil metode instance:
user.addFriend (friendId) ? Dan data diperoleh melalui getter:
user.getFriendsCount () ?
Bagaimana jika kita dapat mengimpor semua fungsionalitas pengguna dengan
impor sederhana?
const userModule from 'node_modules/user-module';
Apakah itu nyaman? Terutama mengingat bahwa untuk ini Anda tidak perlu menulis banyak kode tambahan:
Paket npm redux -module-creator menyediakan semua fungsionalitas untuk membuat
modul redux yang dapat digabungkan, digunakan kembali , dan diuji secara longgar .
Setiap modul terdiri dari
pengontrol ,
peredam, dan
aksi dan memiliki fitur berikut:
- terintegrasi ke dalam toko melalui panggilan ke metode integrator, dan untuk mengubah tempat integrasi, Anda hanya perlu mengubah tempat panggilan integrator dan parameternya

- controller memiliki koneksi dengan bagian data di toko , mengingat jalur yang dilewatkan ke integrator () sekali. Ini menghilangkan kebutuhan untuk mengetahuinya saat menggunakan data.

- controller adalah pemegang semua penyeleksi, adaptor, dll yang diperlukan
- untuk melacak perubahan, dimungkinkan untuk berlangganan perubahan pada data Anda sendiri
- reducer dapat menggunakan konteks panggilan - sebuah instance dari modul dan mendapatkan actionType milik modul itu. Ini menghilangkan kebutuhan untuk mengimpor banyak tindakan dan mengurangi kemungkinan kesalahan.
- action mendapatkan konteks penggunaan, karena mereka menjadi bagian dari contoh modul: sekarang ini bukan hanya trainingFinished , tetapi readingModule.actions.trainingFinished
- action `s sekarang ada di namespace modul, yang memungkinkan Anda untuk membuat acara dengan nama yang sama untuk modul yang berbeda
- setiap modul dapat dipakai beberapa kali, dan setiap instance diintegrasikan ke dalam berbagai bagian toko
- action`s untuk instance modul yang berbeda memiliki actionType yang berbeda - Anda dapat menanggapi peristiwa dari instance tertentu
Akibatnya, kami mendapatkan kotak hitam yang dapat mengelola datanya sendiri dan memiliki pegangan untuk berkomunikasi dengan kode eksternal.
Pada saat yang sama, itu adalah
redux yang sama, dengan aliran data searah, transparansi dan dapat diprediksi.
Dan karena ini semua redux yang sama dan semua
reduksi yang sama, Anda dapat membangun struktur apa pun dari mereka yang diperlukan oleh logika domain aplikasi.