React-Redux ist eine großartige Sache. Bei korrekter Verwendung ist die Anwendungsarchitektur effizient und die Projektstruktur leicht zu lesen. Aber wie bei jeder Entscheidung gibt es einige Besonderheiten.
Die Beschreibung von Aktionen und Reduzierern ist eines dieser Merkmale. Die klassische Implementierung dieser beiden Entitäten in Code ist eine ziemlich zeitaufwändige Aufgabe.
Der Schmerz der klassischen Implementierung
Ein einfaches Beispiel:
Die Ausgabe hat 3 Dateien und mindestens die folgenden Probleme:
- "Aufblähen" des Codes durch einfaches Hinzufügen einer neuen Aktionskette
- übermäßiger Import von Aktionskonstanten
- Lesen von Aktionskonstantennamen (einzeln)
Optimierung
Dieses Beispiel kann mit
Redux-Aktionen verbessert werden.
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)
Schon viel besser, aber der Perfektion sind keine Grenzen gesetzt.
Schmerz behandeln
Auf der Suche nach einer besseren Lösung stieß ich auf einen Kommentar von
LestaD habr.com/de/post/350850/#comment_10706454 und beschloss,
Redux- Symbiote auszuprobieren .
Dadurch konnten unnötige Entitäten entfernt und die Codemenge reduziert werden.
Das obige Beispiel sah folgendermaßen aus:
Von den Profis haben wir:- alles in einer Datei
- weniger Code
- strukturierte Darstellung von Aktionen
Von den Minuspunkten:- IDE bietet nicht immer Hinweise
- Es ist schwierig, im Code nach Aktionen zu suchen
- Aktion schwer umzubenennen
Trotz der Nachteile wird dieses Modul erfolgreich in unseren Projekten eingesetzt.
Vielen Dank an
LestaD für die gute Arbeit.