2017-11-26 245 views
6

Birisi bana Redux'un her ikisi de bir kapsayıcıya sahne ekleyen iki işlevi olan mapStateToProps ve mapDispatchToProps'un nedenleri olduğunu açıklayabilir mi?Neden mapStateToProps ve mapDispatchToProps, Redux'da sadece bir işlev değil mi?

Tanımlar:

mapStateToProps sizin bileşen

mapDispatchToProps sizin bileşeni yardımcı olacak bir yardımcı programdır (diğer bazı bileşenleri tarafından güncellenir) devlet güncellenmelerini yardımcı bir araçtır bir eylem olayı ( başvuru durumunun değişmesine neden olabilecek gönderme eylemi) tetikleme

Neden Redux takımı bunu iki eşleme işlevine ayırmayı tercih etti - yani neden her ikisini birden gerçekleştiren bir mapToProps (durum, gönderme, sahne) özelliği yok?

  • Sadece endişelerin ayrımı/anlaşılması kolay neden mi?
  • mapDispatchToProps'da yeniden bağlama ile ilgili her sorun için yeni işlevler oluşturan performans sorunları nedeniyle mi? Aksiyon yaratımları için ayrı işlevlere sahip olmak, bu fazladan işten kaçınmanıza yardımcı olur mu? Her durum değişikliğinde mapStateToProps'un çağrılması düşünüldüğünde.

Örnek:

const increaseAction = { type: 'increase' } 

class Counter extends Component { 
    render() { 
    const { value, onIncreaseClick } = this.props 
    return (
     <div> 
     <span>{value}</span> 
     <button onClick={onIncreaseClick}>Increase</button> 
     </div> 
    ) 
    } 
} 

function mapDispatchToProps(dispatch) { 
    return { 
    onIncreaseClick:() => dispatch(increaseAction) 
    } 

}

bu Redux example on codesandbox

+2

Redux Dan Abramov yazarı (https://www.youtube.com/watch?v=VJ38wSFbM3A&feature=youtu.be&t=2455) mapDispatchToProps' her eylem yaratıcısı için fonksiyonlarını ayırır 'O olmasıdır [buradan] açıklıyor Çok fazla bileşeniniz olduğunda yeniden yapmak çok maliyetli bir işlemdir. Redux'un durumu ve eylem yaratıcısı bağlayıcılarını güncellemeye ihtiyaç duyduğunu tespit eden iki farklı mekanizma var gibi görünüyor - bu nedenle iki farklı işlev var: mapStateToProps ve mapDispatchToProps. Cevap bu mu? –

cevap

2

@Andrey Prokhorov Bkz doğru olduğunu ve sen sorulan komik. Bugün kendimi github sorunlarının bağırsaklarında buldum ve bu sorunu buldum (Add state as the third parameter to mapDispatchToProps). başlığı Yorumlar yoluyla kazmak ise, ilgili görünmüyor olsa da, gaearon (tepki-redux yaratıcısı) anlatıyor:

#1 bir göz atın. Bu seçenek kabul edildi ve reddedildi. Evet, performans yaratıcısı 'u her gönderiye yeniden bağlamak için performans çok kötü. Bu, kullanıcıların durumlarına, eylem oluşturuculara bağlandıkları yere erişmesine izin verirsek ne olacağıyla ilgili bir sorun. Teknik olarak hala mergeProps ile yapabilirler, ancak Redux ile deneyimlemeyen kişilerin, hatası ile bulamadıkları yeterince iyi gizlenmiş .

Ayrıca (kelimenin tam anlamıyla reaksiyona-Redux github 1. sorunu olan) bu tartışılmıştır-Redux reaksiyona için bağlantılı gaearon ilk sorununa bağlı. Onlar açıkladığınız şekilde değiştirmek OLABİLECEK eminim, ama ben gaearon yorumu, o özetliyor düşünüyorum:

bu kütüphanenin amaç aksi takdirde insanlar diyecekler “Redux yavaş olduğundan performant kalıplarını teşvik etmektir! ”Nedeni ise, alt-işlevsellik bağlanma kodudur.Bunun olmasını istemiyoruz, bu yüzden uygulama yapmak için zor olan bazı vakaları daha çok yerine getirmeyi tercih ediyoruz.

+1

Genellikle, kütüphanelerin yaratıcıları kütüphane kodunun aslında nasıl çalıştığını soyutlamaya çalışırlar, yani, redux durumunun ve gönderilen eylemlerin bir bileşenin parçalarına nasıl dönüştüğü arasındaki fark gibi uygulama ayrıntılarını gizlerler. Bu Redux için geçerli değil. Yorumunuz için teşekkürler, neden eğitim amaçlı bir amaç haline geliyor! Pek çok kişinin böyle bir uygulama hakkında düşünmediği üzücü bir durum, bu soru sorulduktan sonra ilk 2 hafta boyunca 100'den az görüntü aldı :) –