Tepki ve Redux
her ikisinin de tahmin edilebilir bir tarzda çalışabilmesi için değişmezlikle birlikte saf fonksiyonlara ihtiyacı vardır.
Bu iki şeyi izlemezseniz, uygulamanızda hatalar bulunur; en yaygın olanı React/Redux
değişiklikleri izleyemez ve değişiklikleriniz sırasında yeniden işleme koyamaz state/prop
.
Tepki açısından, aşağıdaki örneği göz önünde bulundurun:
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();
}
Durum, yalnızca özellik ekleyen durum nesnesi tarafından tutulur. Bu uygulama, uygulama mülkünü işler. Bir şey olduğunda durumu her zaman oluşturmamalı, ancak durum nesnesinde bir değişiklik olup olmadığını kontrol etmelidir.
Bunun gibi, durumumuzu pure function
etkilemek için kullandığımız bir efekt fonksiyonumuz var . Durumun değiştirilmesi gerektiğinde yeni bir durum döndürdüğünü ve değişiklik yapılmadığında aynı durumu döndürdüğünü görürsünüz.
Ayrıca shouldUpdate
, === operatörünü kullanarak eski durumun ve yeni durumun aynı olup olmadığını kontrol eden bir fonksiyonumuz var .
Tepki açısından hata yapmak için aşağıdakileri yapabilirsiniz:
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;
}
Durumu doğrudan kullanarak ve effects
işlevi kullanarak hatalar da yapabilirsiniz .
function doMistake(newValue) {
this.state = newValue
}
Yukarıdakiler yapılmamalı ve effects
durumu güncellemek için sadece işlev kullanılmalıdır.
Tepki açısından, biz diyoruz effects
olarak setState
.
Redux için:
- Redux'un
combineReducers
yardımcı programı referans değişikliklerini kontrol eder.
- React-Redux
connect
yöntemi mapState
, sarılmış bileşenin gerçekten yeniden oluşturulması gerekip gerekmediğini görmek için işlevlerden hem kök durumu hem de dönüş değerleri için başvuru değişikliklerini denetleyen bileşenler oluşturur.
- Zaman yolculuğunda hata ayıklama,
pure functions
farklı durumlar arasında doğru şekilde atlayabilmeniz için redüktörün hiçbir yan etkisi olmamasını gerektirir .
İndirgeyici olarak saf olmayan fonksiyonları kullanarak yukarıdaki üçünü kolayca ihlal edebilirsiniz.
Doğrudan redux belgelerinden aşağıdakiler alınır:
Buna redüktör denir, çünkü geçeceğiniz işlev türüdür Array.prototype.reduce(reducer, ?initialValue)
.
Redüktörün saf kalması çok önemlidir. Bir redüktör içinde asla yapmamanız gereken şeyler:
Mutate its arguments;
Perform side effects like API calls and routing transitions;
Call non-pure functions, e.g. Date.now() or Math.random().
Aynı argümanlar verildiğinde, bir sonraki durumu hesaplamalı ve geri vermelidir. Sürpriz yok. Yan efektleri olmayan. API çağrısı yok. Mutasyon yok. Sadece bir hesaplama.
window.getElementById
Vb gibi bir şey aynı işlevi aynı parametrelerle çalıştırmak yan etkilere bağlı olarak farklı sonuçlar olabilir. Burada redux başarısız olur.