2016-12-07 2 views
0

Ich benutze das serverseitige Rendering für die App, ich möchte einige Daten über die API laden, bevor die Seite am Server rendert. Wie ich fand, wird die KomponenteWillMount vor dem Rendern sowohl Server-Seite und Client-Seite aufgerufen, aber es führt den Ajax-Code nicht aus. Sagt $ ist undefined, Bitte jemand sagen mir, wie die Daten vor dem Rendern der Seite geladen werden.

+2

Geben Sie uns einen Code zum Arbeiten mit –

+0

Verwenden Sie nicht jQuery AJAX. Es funktioniert nur im Browser. Verwenden Sie einen "isomorphen" oder "universellen" Client wie Axios, Superagenten, Isomorphic-Fetch usw. –

Antwort

0

Dies ist eine allgemeine Antwort wegen des Mangels an Details in der Frage. Aber ich hoffe, es bringt etwas Licht in das Thema.

Basierend auf meiner persönlichen Erfahrung, wenn Sie Server-Rendering reagieren Sie besser eine "Controller" Out-most-Komponente, die mit dem gesamten Staat und alles darunter sollte meist kontrolliert werden oder nicht von Ajax abhängen abhängen lade Daten überhaupt. Wenn Sie beispielsweise Redux verwenden, wäre diese "Controller" -Komponente die Provider. Dies liegt daran, dass es für eine Komponente viel einfacher ist, Server und Client als alle anderen zu behandeln.

Jetzt sollte die äußere "Controller" -Komponente wissen, ob es auf dem Server ist und Daten entsprechend anders laden. Eine Möglichkeit, dies zu tun, ist zu überprüfen, ob "Fenster" definiert ist. Das heißt: Wenn Sie sich auf dem Server befinden, verwenden Sie nicht Ajax al all, um den Anfangszustand zu laden. Aber wenn Sie auf dem Client sind, dann verwenden Sie Ajax.

Jetzt haben Sie ein letztes Problem. Wenn Sie Server-Rendering durchführen, möchten Sie nicht, dass der Client zum Server zurückgereist wird, um die gleichen Daten zu erhalten, die er bereits hat. Um dies zu verhindern, rendern Sie einen Skriptblock, der auf dem Client ausgeführt werden soll, der den Anfangszustand enthält, und führen Sie NICHT das Ajax durch, wenn diese Variable gesetzt ist. Wie folgt aus:

<script> 
    window._serverState = {...} 
</script> 

Eine andere Sache .. ich persönlich nicht $ für Ajax verwenden Ich denke nicht, Reagieren und jQuery sollten zusammen verwendet werden. Schauen Sie sich Axios an.

+0

jQuery _can_ verwendet werden, wenn Sie jedoch Ihre Abhängigkeit zu reduzieren möchten, können Sie eine Drittanbieter-Bibliothek wie Axios verwenden. Es ist eine Wahl mehr als alles andere imo. – DOMZE

0

Generell ist es nicht ratsam, einen AJAX-Anruf unter componentWillMount zu tätigen. Da das Rendern sofort nach dem componentWillMount Rendering erfolgt, muss das Rendering warten, bis der Ajax-Aufruf abgeschlossen ist und neue Daten erhalten.

Es ist besser, die Wiedergabe zum ersten Mal mit leeren Zustandsdaten können sagen

data:[] 

und Anruf Ajax in componentDidMount getan, dann ist dies der Ort, wo Sie die DOM-Manipulation durchführen können und Ajax-Anforderung senden.

componentDidMount() { 
sendAjaxRequest() 
.then(
     (newDataFromServer) => { 
       this.setState({data : newDataFromServer }); 

    }); 
} 

Nach neuen Daten abgerufen vom Server den Zustand mit neuen Datensatz

this.setState({data:newDataFromServer}); 

Dies wird die Wieder Rendering verursachen geschehen mit den neuesten Daten vom Server und neue Zustandsänderungen geholt werden reflektiert.

Verwandte Themen