Redux'tan ilham alan RxJS kodunu yaptığım zamandan bazı pragmatik farklılıklar eklemek istedim.
Her eylem türünü bir Konu örneğiyle eşledim. Her durum bilgili bileşenin, daha sonra bir indirgeyici işlevle eşleştirilen bir Öznesi olacaktır. Tüm indirgeyici akışlar ile birleştirilir merge
ve ardından scan
durum çıkarılır . Varsayılan değer ile ayarlanır startWith
hemen önce scan
. publishReplay(1)
Eyaletler için kullandım , ancak daha sonra kaldırabilirim.
React pure render işlevi, yalnızca tüm üreticileri / Konuları göndererek olay verilerini oluşturduğunuz yerde olacaktır.
Alt bileşenleriniz varsa, bu durumların sizinkiyle nasıl birleştirildiğini açıklamanız gerekir. combineLatest
bunun için iyi bir başlangıç noktası olabilir.
Uygulamada dikkate değer farklılıklar:
Ara yazılım yok, sadece rxjs operatörleri. Bence bu en büyük güç ve zayıflık. Yine de kavramları ödünç alabilirsiniz, ancak yine de başka bir özel çözüm olduğu için redux ve cycle.js gibi kardeş topluluklardan yardım almakta zorlanıyorum. Bu yüzden bu metinde "biz" yerine "ben" yazmam gerekiyor.
Eylem türleri için anahtar / durum veya dizeler yok. Eylemleri ayırmanın daha dinamik bir yoluna sahipsiniz.
rxjs başka bir yerde bir araç olarak kullanılabilir ve durum yönetimine dahil değildir.
Eylem türlerinden daha az üretici sayısı (?). Bundan emin değilim, ancak alt bileşenleri dinleyen ana bileşenlerde birçok tepkiye sahip olabilirsiniz. Bu, daha az zorunlu kod ve daha az karmaşıklık anlamına gelir.
Çözüme sahipsiniz. Çerçeve gerekmez. İyi ve kötü. Nasılsa kendi çerçevenizi yazacaksınız.
Bu çok daha fraktaldır ve bir alt ağaçtan veya uygulama durum ağacının birden çok bölümünden değişikliklere kolayca abone olabilirsiniz.
- Redux-obseravble'ın yaptığı gibi destanlar yapmak ne kadar kolay tahmin edin? Gerçekten kolay.
Ayrıca, alt bileşenlerin akış olarak tanımlandığı çok daha büyük faydalar üzerinde çalışıyorum. Bu, indirgeyicilerde ebeveyn ve alt durumu derlemek zorunda olmadığımız anlamına gelir, çünkü durumları bileşen yapısına dayalı olarak sadece ("sadece") özyinelemeli olarak birleştirebiliriz.
React reaktif durumları daha iyi ele alıncaya kadar tepki vermeyi atlamayı ve snabbdom veya başka bir şeyle devam etmeyi düşünüyorum. Durumumuzu neden tekrar sahne ile parçalamak için yukarı doğru inşa etmeliyiz? Bu yüzden Snabbdom ile bu kalıbın 2. versiyonunu yapmaya çalışacağım.
Burada, state.ts dosyasının durum akışını oluşturduğu daha gelişmiş ancak küçük bir snippet var. Bu, doğrulama kuralları ve css stilleri ile alanların (girişlerin) bir nesnesini alan ajax-form bileşeninin durumudur. Bu dosyada, tüm çocukların durumlarını form durumunda birleştirmek için alan adlarını (nesne anahtarları) kullanıyoruz.
export default function create({
Observable,
ajaxInputs
}) {
const fieldStreams = Object.keys(ajaxInputs)
.map(function onMap(fieldName) {
return ajaxInputs[fieldName].state.stream
.map(function onMap(stateData) {
return {stateData, fieldName}
})
})
const stateStream = Observable.combineLatest(...fieldStreams)
.map(function onMap(fieldStreamDataArray) {
return fieldStreamDataArray.reduce(function onReduce(acc, fieldStreamData) {
acc[fieldStreamData.fieldName] = fieldStreamData.stateData
return acc
}, {})
})
return {
stream: stateStream
}
}
Kod tek başına pek bir şey ifade etmese de, durumu nasıl yukarı doğru inşa edebileceğinizi ve dinamik olayları kolaylıkla nasıl üretebileceğinizi gösterir. Ödenecek bedel, farklı bir kod stili anlamanız gerektiğidir. Ve bu bedeli ödemeyi seviyorum.