React-redux adalah hal yang hebat. Ketika digunakan dengan benar, arsitektur aplikasi efisien dan struktur proyek mudah dibaca. Tetapi seperti dalam keputusan apa pun, ada beberapa kekhasan.
Deskripsi tindakan dan reduksi adalah salah satu fitur tersebut. Implementasi klasik dari dua entitas ini dalam kode adalah tugas yang agak memakan waktu.
Rasa sakit implementasi klasik
Contoh sederhana:
Output memiliki 3 file dan setidaknya masalah berikut:
- "Gembung" kode hanya dengan menambahkan rantai tindakan baru
- kelebihan impor konstanta aksi
- membaca nama konstanta aksi (secara individual)
Optimasi
Contoh ini dapat ditingkatkan dengan
tindakan redux .
import { createActions, handleActions, combineActions } from 'redux-actions' export const actions = createActions({ popups: { open: { start: () => ({ loading: true }), pending: () => ({ loading: true }), fail: (error) => ({ loading: false, error }), success: (name, data) => ({ loading: false, name, data }), }, close: { start: () => ({ loading: true }), pending: () => ({ loading: true }), fail: (error) => ({ loading: false, error }), success: (name) => ({ loading: false, name }), }, }, }).popups const initialState = { opened: [] }; export const accountsReducer = handleActions({ [ combineActions( actions.open.start, actions.open.pending, actions.open.success, actions.open.fail, actions.close.start, actions.close.pending, actions.close.success, actions.close.fail ) ]: (state, { payload: { loading } }) => ({ ...state, loading }), [combineActions(actions.open.fail, actions.close.fail)]: (state, { payload: { error } }) => ({ ...state, error }), [actions.open.success]: (state, { payload: { name, data } }) => ({ ...state, error: null, opened: [ ...(state.opened || []).filter(x => x.name !== name), { name, data } ] }), [actions.close.success]: (state, { payload: { name } }) => ({ ...state, error: null, opened: [ ...state.opened.filter(x => x.name !== name) ] }) }, initialState)
Sudah jauh lebih baik, tetapi tidak ada batasan untuk kesempurnaan.
Obati rasa sakit
Dalam mencari solusi yang lebih baik, saya menemukan komentar oleh
LestaD habr.com/en/post/350850/#comment_10706454 dan memutuskan untuk mencoba
redux-symbiote .
Ini memungkinkan untuk menghapus entitas yang tidak perlu dan mengurangi jumlah kode.
Contoh di atas mulai terlihat seperti ini:
Dari pro kami memiliki:- semua dalam satu file
- kode lebih sedikit
- representasi tindakan terstruktur
Dari minus:- IDE tidak selalu menawarkan petunjuk
- sulit untuk mencari tindakan dalam kode
- sulit untuk mengubah nama tindakan
Meskipun kontra, modul ini berhasil digunakan dalam proyek kami.
Terima kasih kepada
LestaD untuk kerja bagusnya.