TL; DR
Olmadan combineReducers()
veya benzer manuel kod, initialState
her zaman yener state = ...
çünkü indirgeyicide state
redüktör geçirilen olduğunu initialState
ve değil undefined
ES6 argüman sözdizimi, bu durumda uygulanan almaz böylece.
İle combineReducers()
davranış daha farklı. Durumu belirtilen redüktörler initialState
bunu alacak state
. Diğer indirgeyiciler alacak undefined
ve bu nedenle belirledikleri state = ...
varsayılan argümana geri dönecekler .
Genel olarak, initialState
redüktör tarafından belirtilen devlet üzerinden kazanır. Bu, indirgeyicilerin varsayılan bağımsız değişkenler olarak kendileri için anlamlı olan ilk verileri belirlemelerine izin verir, ancak aynı zamanda bazı kalıcı depolama alanlarından veya sunucudan depoyu nemlendirirken mevcut verilerin (tamamen veya kısmen) yüklenmesine izin verir.
Öncelikle tek bir redüktörünüzün olduğu bir durumu ele alalım.
Kullanmadığını söyle combineReducers()
.
Düşürücünüz şöyle görünebilir:
function counter(state = 0, action) {
switch (action.type) {
case 'INCREMENT': return state + 1;
case 'DECREMENT': return state - 1;
default: return state;
}
}
Şimdi onunla bir mağaza oluşturduğunuzu varsayalım.
import { createStore } from 'redux';
let store = createStore(counter);
console.log(store.getState());
Başlangıç durumu sıfırdır. Neden? Çünkü ikinci argüman createStore
oldu undefined
. Bu, state
redüktörünüze ilk kez geçer. Redux başlatıldığında, durumu doldurmak için "kukla" bir eylem gönderir. Yani counter
redüktörünüz state
eşit olarak çağrıldı undefined
. Varsayılan argümanı "etkinleştiren" durum tam olarak budur. Bu nedenle, state
şimdi 0
varsayılan state
değere ( state = 0
) göre. Bu durum ( 0
) döndürülecek.
Farklı bir senaryo düşünelim:
import { createStore } from 'redux';
let store = createStore(counter, 42);
console.log(store.getState());
Neden bu sefer 42
değil 0
mi? Çünkü ikinci argüman olarak createStore
çağrıldı 42
. Bu argüman state
, kukla eylemle birlikte indirgeyicinize aktarılır. Bu sefer state
tanımsız değildir (bu 42
!), Dolayısıyla ES6 varsayılan bağımsız değişken sözdiziminin bir etkisi yoktur. state
Olduğu 42
ve 42
redüktör döndürülür.
Şimdi, kullandığınız bir durumu ele alalım combineReducers()
.
İki azaltıcınız var:
function a(state = 'lol', action) {
return state;
}
function b(state = 'wat', action) {
return state;
}
Oluşturduğu redüktör combineReducers({ a, b })
şuna benzer:
function combined(state = {}, action) {
return {
a: a(state.a, action),
b: b(state.b, action)
};
}
Eğer createStore
olmadan initialState
ararsak, state
to başlatılacaktır {}
. Bu nedenle, state.a
ve state.b
olacak undefined
o çağıran süreye göre a
ve b
düşürücüler. Hem a
ve b
düşürücüler alacak undefined
şekilde onların state
argümanları ve bunlar varsayılan belirtirseniz state
değerleri, bu iade edilir. Bu, birleşik indirgeyicinin { a: 'lol', b: 'wat' }
ilk çağrıda bir durum nesnesi döndürmesinin şeklidir.
import { createStore } from 'redux';
let store = createStore(combined);
console.log(store.getState());
Farklı bir senaryo düşünelim:
import { createStore } from 'redux';
let store = createStore(combined, { a: 'horse' });
console.log(store.getState());
Şimdi initialState
argüman olarak belirttim createStore()
. Kombine düşürücü dönen devlet biçerdöver ben için belirtilen başlangıç durumu a
ile redüktör 'wat'
varsayılan argüman belirtti b
redüktör kendisini seçti.
Kombine redüktörün ne yaptığını hatırlayalım:
function combined(state = {}, action) {
return {
a: a(state.a, action),
b: b(state.b, action)
};
}
Bu durumda, state
geri dönmemesi için belirtildi {}
. Bu, a
alanı eşit 'horse'
, ancak b
alanı olmayan bir nesneydi . Bu yüzden a
redüktör alınan 'horse'
olarak onun state
ve memnuniyetle geri dönmesine rağmen b
redüktör alınan undefined
olarak onun state
ve böylece dönen onun fikrini temerrüt state
(bizim örneğimizde 'wat'
). { a: 'horse', b: 'wat' }
Karşılığında böyle alıyoruz .
Özetlemek gerekirse, Redux kurallarına sadık kalırsanız undefined
ve state
argüman olarak çağrıldıklarında indirgeyicilerden başlangıç durumunu döndürürseniz (bunu uygulamanın en kolay yolu state
ES6 varsayılan argüman değerini belirlemektir ), sahip olacaksınız kombine redüktörler için güzel ve kullanışlı bir davranış. İşleve ilettiğiniz initialState
nesnede karşılık gelen değeri tercih edeceklerdir createStore()
, ancak herhangi birini geçmediyseniz veya ilgili alan ayarlanmamışsa, state
bunun yerine indirgeyici tarafından belirtilen varsayılan bağımsız değişken seçilir.Bu yaklaşım, mevcut verilerin hem başlatılmasını hem de hidrasyonunu sağladığından iyi çalışır, ancak verileri korunmadıysa bireysel indirgeyicilerin durumlarını sıfırlamasına izin verir. Elbette bu modeli combineReducers()
birçok düzeyde kullanabileceğiniz gibi yinelemeli olarak uygulayabilir veya hatta redüktörleri arayarak ve onlara durum ağacının ilgili bölümünü vererek azaltıcıları manuel olarak oluşturabilirsiniz.
combineReducers
. Tekrar çok teşekkür ederim.