Reakcja i Redux
obie 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/Redux
nie można śledzić zmian i nie można ich ponownie renderować po state/prop
wprowadzeniu 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 function
któ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ż shouldUpdate
funkcję, 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 effects
funkcji.
function doMistake(newValue) {
this.state = newValue
}
Powyższe nie powinno być wykonane i effects
należy użyć tylko funkcji do aktualizacji stanu.
Pod względem React nazywamy effects
jako setState
.
W przypadku Redux:
combineReducers
Narzędzie Redux sprawdza zmiany referencyjne.
connect
Metoda React-Redux generuje komponenty, które sprawdzają zmiany odniesienia zarówno dla stanu głównego, jak i zwracanych wartości z mapState
funkcji, aby sprawdzić, czy zawinięty komponent rzeczywiście musi się ponownie renderować.
- Debugowanie w czasie wymaga, aby reduktor był
pure functions
bez 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.getElementById
itp., 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ę.