Reagir e Reduxambos precisam de funções puras, aliadas à imutabilidade, para serem executadas de maneira previsível.
Se você não seguir essas duas coisas, seu aplicativo terá bugs, sendo o mais comum React/Reduxnão conseguir rastrear as alterações e não conseguir renderizá- las novamente novamente state/prop.
Em termos de React, considere o seguinte exemplo:
let state = {
add: 0,
}
function render() {
//...
}
//pure function
function effects(state,action) {
//following immutability while updating state, not directly mutating the state.
if(action == 'addTen') {
return {...state, add: state.add + 10}
}
return state;
}
function shouldUpdate(s) {
if(s === state){
return false
}
return true
}
state = effects(state, 'addTen')if(shouldUpdate(state)) {
render();
}
O estado é mantido pelo objeto state, que apenas adicionou propriedade. Este aplicativo renderiza a propriedade do aplicativo. Ele nem sempre deve renderizar o estado quando algo acontece, mas deve verificar se ocorreu uma alteração no objeto de estado.
Assim, temos uma função de efeitos, pure functionque usamos para afetar nosso estado. Você vê que ele retorna um novo estado quando o estado deve ser alterado e retorna o mesmo estado quando nenhuma modificação é necessária.
Também temos uma shouldUpdatefunção que verifica, usando o operador ===, se o estado antigo e o novo estado são iguais.
Para cometer erros em termos de React, você pode realmente fazer o seguinte:
function effects(state,action) {
doRandom(); // effects should only be called for updating state.
// Doing any other stuff here would make effects impure.
if(action == 'addTen') {
return {...state, add: state.add + 10}
}
return state;
}
Você também pode cometer erros definindo o estado diretamente e não usando a effectsfunção.
function doMistake(newValue) {
this.state = newValue
}
O procedimento acima não deve ser feito e apenas a effectsfunção deve ser usada para atualizar o estado.
Em termos de Reagir, nós chamamos effectscomo setState.
Para Redux:
- O
combineReducersutilitário do Redux verifica alterações de referência.
- O
connectmétodo React-Redux gera componentes que verificam as alterações de referência para o estado raiz e os valores de retorno das mapStatefunções para verificar se o componente empacotado realmente precisa ser renderizado novamente.
- A depuração da viagem no tempo exige que o redutor
pure functionsnão tenha efeitos colaterais, para que você possa saltar corretamente entre diferentes estados.
Você pode violar facilmente os três acima usando funções impuras como redutores.
O seguinte é obtido diretamente dos documentos do redux:
É chamado de redutor porque é o tipo de função para a qual você passaria Array.prototype.reduce(reducer, ?initialValue).
É muito importante que o redutor permaneça puro. Coisas que você nunca deve fazer dentro de um redutor:
Mutate its arguments;
Perform side effects like API calls and routing transitions;
Call non-pure functions, e.g. Date.now() or Math.random().
Dados os mesmos argumentos, ele deve calcular o próximo estado e retorná-lo. Sem surpresas. Sem efeitos colaterais. Nenhuma chamada de API. Sem mutações. Apenas um cálculo.
window.getElementByIdetc, portanto, executar a mesma função com os mesmos parâmetros pode ter resultados diferentes, dependendo dos efeitos colaterais. É aí que o redux falharia.