Reagir e Redux
ambos 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/Redux
nã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 function
que 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 shouldUpdate
funçã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 effects
função.
function doMistake(newValue) {
this.state = newValue
}
O procedimento acima não deve ser feito e apenas a effects
função deve ser usada para atualizar o estado.
Em termos de Reagir, nós chamamos effects
como setState
.
Para Redux:
- O
combineReducers
utilitário do Redux verifica alterações de referência.
- O
connect
método React-Redux gera componentes que verificam as alterações de referência para o estado raiz e os valores de retorno das mapState
funções para verificar se o componente empacotado realmente precisa ser renderizado novamente.
- A depuração da viagem no tempo exige que o redutor
pure functions
nã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.getElementById
etc, portanto, executar a mesma função com os mesmos parâmetros pode ter resultados diferentes, dependendo dos efeitos colaterais. É aí que o redux falharia.