React-redux é uma grande coisa. Quando usada corretamente, a arquitetura do aplicativo é eficiente e a estrutura do projeto é fácil de ler. Mas, como em qualquer decisão, existem algumas peculiaridades.
A descrição de ações e redutores é um desses recursos. A implementação clássica dessas duas entidades no código é uma tarefa bastante demorada.
A dor da implementação clássica
Um exemplo simples:
A saída possui 3 arquivos e pelo menos os seguintes problemas:
- "Bloat" o código simplesmente adicionando uma nova cadeia de ações
- excesso de importação de constantes de ação
- lendo nomes de constantes de ação (individualmente)
Otimização
Este exemplo pode ser aprimorado com
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)
Já é muito melhor, mas não há limite para a perfeição.
Tratar a dor
Em busca de uma solução melhor, deparei-me com um comentário de
LestaD habr.com/en/post/350850/#comment_10706454 e decidi experimentar o
redux-symbiote .
Isso permitiu remover entidades desnecessárias e reduzir a quantidade de código.
O exemplo acima começou a ficar assim:
Dos profissionais que temos:- tudo em um arquivo
- menos código
- representação estruturada de ações
Dos menos:- O IDE nem sempre oferece dicas
- difícil procurar ação no código
- difícil renomear ação
Apesar dos contras, este módulo é usado com sucesso em nossos projetos.
Obrigado ao
LestaD pelo bom trabalho.