2016-04-22 23 views
31

React/Redux'u öğrenmeye başladım ve muhtemelen çok basit bir soru olan bir şeye tökezledim. Aşağıda, sadeleştirme uğruna kaldırılmış bazı kodlarla uygulamamın snippet'leri var.Bir React Redux uygulamasında ilk verileri sunucudan nereden alırım?

Durumum, varsayılan olarak boş olan bir siteler dizisi tarafından açıklanmaktadır. Daha sonra indirici, kullanıcı farklı bir sayfaya paginat oluşturduğunda farklı bir site kümesini yüklemek için LOAD_SITES eylemine sahip olacak ancak şimdilik hiçbir şey yapmıyor. Tepki, PublishedSitesPage'u oluşturarak başlar, daha sonra PublishedSitesBox'u oluşturur, bu daha sonra veriler üzerinde döngü yapar ve tek tek siteler oluşturur.

Yapmak istediğim, her şeyi varsayılan boş diziyle oluşturması ve bu arada "sunucudan yükleme siteleri" sözünü başlatması ve bir kez çözüldüğünde LOAD_SITES eylemini göndermesidir. Bu çağrıyı yapmanın en iyi yolu nedir? PublishedSitesBox ya da belki de componentDidMount'un kurucusunu düşünüyordum. Ancak bunun işe yarayıp yaramayacağından emin değilim - kaygılarım yeniden şekillendirmeye devam edecek sonsuz bir döngü oluşturacağım. Sanırım bu sonsuz döngüyü bir şekilde "haveRequestedInitialData" satırları boyunca başka bir devlet paramiti ile önleyebilirim. Yaptığım bir diğer fikir ise, bu sözü ReactDOM.render() yaptıktan sonra yapmak. Bunu yapmanın en iyi ve en temiz yolu nedir?

export default function sites(state = [], action) { 
    switch (action.type) { 
    default: 
     return state; 
    } 
} 
... 

const publishedSitesPageReducer = combineReducers({ 
    sites 
}); 

ReactDOM.render(
    <Provider store={createStore(publishedSitesPageReducer)}> 
    <PublishedSitesPage /> 
    </Provider>, 
    this.$view.find('.js-published-sites-result-target')[0] 
); 

... 

export default function PublishedSitesPage() { 
    return (
    <PublishedSitesBox/> 
); 
} 

... 

function mapStateToProps(state) { 
    return { sites: state.sites }; 
} 

const PublishedSitesBox = connect(mapStateToProps)(({sites}) => { 
    // render sites 
}); 

cevap

29

Bu veri yükleme mantığının React bileşenlerine hiç dokunmaması için bir neden yoktur. Burada istediğiniz şey, indirgeyicilere bir eylem gönderme vaadinin iadesidir, bu da mağazada uygun değişiklikleri yapar ve bu da React bileşenlerinin uygun şekilde yeniden oluşturulmasına neden olur.

(eğer ReactDOM.render aramadan önce veya sonra Size zaman uyumsuz çağrı başlaması farketmez; vaadi her iki şekilde çalışır) böyle

şey: Sizin Tepki

var store = createStore(publishedSitesPageReducer); 

someAsyncCall().then(function(response) { 
    store.dispatch(someActionCreator(response)); 
}); 

ReactDOM.render(
    <Provider store={store}> 
    <PublishedSitesPage /> 
    </Provider>, 
    this.$view.find('.js-published-sites-result-target')[0] 
); 

bileşenler mağazanızın tüketicileridir, ancak mağazanızın SADECE tüketicileri olmaları için bir kural yoktur.

+0

Teşekkürler, evet, bu mantıklı ve bu benim düşünmeyi düşündüğüm yollardan biri oldu ama bunu yapmanın ya da bir çeşit "getirme durumu" büyüsünün gizli olup olmadığından emin değildi. Bir yerde tepki/redux çerçevesinde. Yarın deneyecek ve işe yarayıp yaramadığını görecek! – Eugene

+1

Bir Redux mağazası hakkındaki en müthiş şeylerden biri, aslında çeşitli yerlerden gelen veriler için ortak takas odası olabileceğidir. Örneğin, uzak canlı veri kaynaklarına yönelik web soketleri, herhangi bir kullanıcı girişi olmadan mağazanızı güncelleyen eylemler gönderebilir ve kullanıcı arayüzünüzün yeni devletin nereden geldiğini bilmesi veya önemsemesi gerekmez. –

+0

Elbette, harekete geçirici, bunun yerine async isteğini yapabilir. –

-4

bunu nasıl burada açık bir örnek vardır: sonsuz döngü, sizin dizisi artık boş olduğunda, Clear Aralığı gelince Facebook Tutorial

. Bu, çevrimi önlemelidir.

+2

Cevabınız için teşekkür ederiz, ancak bu öğreticiyi çoktan okudum ve çok iyi bir veri olsa da yalnızca React için veri getirmeyi açıklıyor. Yapmaya çalıştığım şey, React'ın Redux ile birlikte verildiği bir uygulamada veri almaktır; burada veriler (uygulama durumu) React bileşenlerinden ayrılmalıdır. – Eugene

İlgili konular