Immer
Instalação
https://github.com/immerjs/immer
$ yarn add immer
Uso do Immer na prática
Exemplo de uso em src/modules/cart/reducer.js
import produce from 'immer';export default function cart(state = [], action) {switch (action.type) {case 'ADD_TO_CART':// Cria um rascunho em cima da ação enviadareturn produce(state, draft => {// Procura uma action que já tenha sido disparadaconst productIndex = draft.findIndex(p => p.id === action.product.id);// Caso já tenha sido disparada, acrescenta +1 ao amount do produto estimado anteriormenteif (productIndex >= 0) {draft[productIndex].amount += 1;} else {draft.push({// Caso contrário, adiciona todo o item no estado...action.product,amount: 1,});}});default:return state;}}
ESLint
Ao utilizar o draft, o ESLint acusará que o draft não foi definido.
Para solucionar isso, basta adicionar a regra 'no-param-reassign': 'off',
no .eslintrc.js