React-redux es una gran cosa. Cuando se usa correctamente, la arquitectura de la aplicación es eficiente y la estructura del proyecto es fácil de leer. Pero como en cualquier decisión, hay algunas peculiaridades.
La descripción de acciones y reductores es una de esas características. La implementación clásica de estas dos entidades en el código es una tarea que consume bastante tiempo.
El dolor de la implementación clásica.
Un simple ejemplo:
La salida tiene 3 archivos y al menos los siguientes problemas:
- "Hincha" el código simplemente agregando una nueva cadena de acciones
- importación excesiva de constantes de acción
- lectura de nombres constantes de acción (individualmente)
Optimización
Este ejemplo se puede mejorar con
redux-actions .
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)
Ya mucho mejor, pero no hay límite para la perfección.
Tratar el dolor
En busca de una solución mejor, me encontré con un comentario de
LestaD habr.com/en/post/350850/#comment_10706454 y decidí probar
redux-symbiote .
Esto permitió eliminar entidades innecesarias y reducir la cantidad de código.
El ejemplo anterior comenzó a verse así:
De los profesionales tenemos:- todo en un archivo
- menos código
- representación estructurada de acciones
De las desventajas:- IDE no siempre ofrece pistas
- difícil de buscar acción en el código
- acción difícil de cambiar el nombre
A pesar de las desventajas, este módulo se utiliza con éxito en nuestros proyectos.
Gracias a
LestaD por el buen trabajo.