Il recupero interno del componente utilizzando componentWillMount
non è il posto giusto, nel caso in cui sia necessario eseguire il rendering lato server. Devi in qualche modo spostarlo dal componente del modulo e passare i dati reali come oggetti di scena dopo che è stato recuperato, ad esempio come suggerito da @JakeSendar nella sua risposta.
Ho una certa esperienza facendo app isomorfi con Reagire, e il problema principale che ho riscontrato è il modo di aspettare fino a quando tutti i dati saranno caricati prima del primo render
Come @FakeRainBrigand già accennato nei commenti, non v'è una sola modo per farlo, e dipende dalle tue esigenze.
Ci
è alcuni modi di fare costruire un app isomorfica, il qualche interessante dal mio punto di vista è: https://github.com/webpack/react-starter e http://fluxible.io/
Ma, il modo più elegante per fare questo, come ho capito per me stesso - è quello di organizzare rendering asincrono per reagire componenti, in particolare utilizzando RxJS.
In generale la mia domanda è strutturata come segue:
- vista - React componenti senza alcuna logica (solo una vista)
modelli - osservabili con lo stato attuale (dati iniziale viene caricato utilizzando superagent, allora combinato con altri modelli e/o risultati di azioni). In caso semplice è qualcosa di simile:
Rx.Observable.defer(fetchData).concat(updatesSubject).shareReplay()
azioni (o gli intenti) - Gli osservatori utilizzati per raccoglie l'input dell'utente, fare qualcosa, ed i risultati di azione spedizione verso modelli di abbonati e/o altre azioni. Nel semplice caso qualcosa di simile:
updatesSubject = new Rx.Subject();
action = new Rx.Subject();
action.switchMap(asyncRequest).subscribe(updatesSubject)
componenti - osservabili (flusso di elementi DOM virtuali) combinato dai modelli, altri componenti e azioni (I have a note about this, explaining how and why to create Observable React elements with RxJS), anche ora sto progettando aggiungere componenti parziali (tupla da: reagire componente, osservabili, osservatori e proprietà parzialmente riempiti con l'uso di DI)
router - componente responsabile a portata di mano modifiche di posizione ling, in generale, la caratteristica principale è quella di mappare le modifiche di posizione al flusso di elementi DOM virtuali e meta informazioni. Ma nei dettagli, è po 'più complicato, nel mio caso (generazione url, url attiva l'evidenziazione, la movimentazione rotoli Durante la navigazione, inoltre ha possibilità di percorsi nidificate e viste multiple)
Tutto questo è assemblato insieme usando DI contenitore, nel mio caso simile a angular2 DI container, ma molto semplificato per le mie esigenze specifiche.
Componenti, modelli e azioni vengono creati utilizzando DI.
Su richiesta lato server è come questo:
var rootInjector = new Injector();
// setup server specific providers
rootInjector.provide(..., ...)
app.get('/*', function(req,res){
var injector = rootInjector.createChild();
// setup request specific providers
injector.provide(..., ...);
injector.get(Router)
.first()
.subscribe(function(routingResult){
res.render('app', {
title: routingResult.title,
content: React.renderToString(routingResult.content)
});
});
}
e simile sul lato client:
var rootInjector = new Injector();
// setup server specific providers
// actually this is omitted in my case because default providers are client side
rootInjector.provide(..., ...)
contentElement = document.getElementById('#content');
rootInjector.get(Router)
.subscribe(function(routingResult){
document.title = routingResult.title;
React.render(routingResult.content, contentElement)
});
Rispetto al Flux, è più dichiarativo e il modo più potente per organizzare app. E in caso di app isomorfa - per me, sembra molto meglio che vari hack con flusso. Ma naturalmente ci sono degli svantaggi ... - è più complicato.
Probabilmente più tardi, aprirò tutto questo, ma per ora non è ancora pronto per essere pubblicato.
UPD1:
risposta originale è un po 'obsolete (poi ho intenzione di aggiornarlo), e ho qualche progresso in questo settore.
Convenzionale codice di cui sopra, già opensourced:
- DI contenitore: di1
- Contenitore per reagire componentns (collegamento vista osservabili e obsrvers): rx-react-container
- modello avviamento, per attuare i widget isomorfi , utilizzando RxJS e React e librerie sopra: Reactive Widgets
Informazioni sull'applicazione completa (Lavori ancora in corso, e la documentazione non v'è abbastanza buona, ma in generale dovrebbe essere chiaro):
- Router costruito appositamente per le applicazioni reattive isomophic router1 e reagire componenti di usarlo router1-react
- modello di applicazione con router e tutte le librerie di cui sopra: router1-app-template
La parte isomorfa è complicata ... non esiste un modo giusto per farlo, e il modo giusto per voi dipende da molte variabili dal router che si utilizza, dal modo in cui il server è organizzato, alle modalità in di cui hai bisogno per recuperare i dati, al livello di astrazione con cui sei a tuo agio. – FakeRainBrigand
@FakeRainBrigand hai qualche esempio semplice? tutto quello che ho bisogno di fare una semplice API e attendere la risposta e il dolore è così. Ho fatto qualcosa, ma il rendering non è in attesa finché non viene effettuata la chiamata – kobe
@FakeRainBrigand, in pratica sto seguendo l'esempio di seguito. https://github.com/DavidWells/isomorphic-react-example, l'unica differenza è che voglio i dati dinamici dalla chiamata api. – kobe