Reakcja i Reduxobie potrzebują czystych funkcji w połączeniu z niezmiennością do działania w przewidywalny sposób.
Jeśli nie zastosujesz się do tych dwóch rzeczy, aplikacja będzie zawierała błędy, z których najczęściej React/Reduxnie można śledzić zmian i nie można ich ponownie renderować po state/propwprowadzeniu zmian.
Jeśli chodzi o React, rozważ następujący przykład:
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();
}
Stan jest utrzymywany przez obiekt stanu, który tylko dodał właściwość. Ta aplikacja renderuje właściwość aplikacji. Nie zawsze powinien renderować stan, gdy coś się dzieje, ale powinien sprawdzać, czy nastąpiła zmiana w obiekcie stanu.
W ten sposób mamy funkcję efektów, pure functionktórej używamy, aby wpływać na nasz stan. Widzisz, że zwraca nowy stan, gdy stan ma zostać zmieniony, i zwraca ten sam stan, gdy modyfikacja nie jest wymagana.
Mamy również shouldUpdatefunkcję, która sprawdza za pomocą operatora ===, czy stary stan i nowy stan są takie same.
Aby popełnić błędy w zakresie React, możesz w rzeczywistości wykonać następujące czynności:
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;
}
Możesz także popełniać błędy, ustawiając stan bezpośrednio i nie używając effectsfunkcji.
function doMistake(newValue) {
this.state = newValue
}
Powyższe nie powinno być wykonane i effectsnależy użyć tylko funkcji do aktualizacji stanu.
Pod względem React nazywamy effectsjako setState.
W przypadku Redux:
combineReducersNarzędzie Redux sprawdza zmiany referencyjne.
connectMetoda React-Redux generuje komponenty, które sprawdzają zmiany odniesienia zarówno dla stanu głównego, jak i zwracanych wartości z mapStatefunkcji, aby sprawdzić, czy zawinięty komponent rzeczywiście musi się ponownie renderować.
- Debugowanie w czasie wymaga, aby reduktor był
pure functionsbez skutków ubocznych, aby można było poprawnie przeskakiwać między różnymi stanami.
Możesz łatwo złamać powyższe trzy, używając nieczystych funkcji jako reduktorów.
Poniżej zaczerpnięto bezpośrednio z dokumentów redux:
Nazywa się to reduktorem, ponieważ jest to typ funkcji, do której należy przekazać Array.prototype.reduce(reducer, ?initialValue).
Bardzo ważne jest, aby reduktor pozostał czysty. Rzeczy, których nigdy nie powinieneś robić wewnątrz reduktora:
Mutate its arguments;
Perform side effects like API calls and routing transitions;
Call non-pure functions, e.g. Date.now() or Math.random().
Biorąc pod uwagę te same argumenty, powinien obliczyć następny stan i zwrócić go. Bez niespodzianek. Bez skutków ubocznych. Brak wywołań API. Bez mutacji. Tylko kalkulacja.
window.getElementByIditp., Więc uruchomienie tej samej funkcji z tymi samymi parametrami może mieć różne wyniki w zależności od skutków ubocznych. W takim przypadku redux nie powiodło się.