Mam problem z jednym z moich komponentów React. Myślę, że AJAX nie ładuje całej zawartości z zewnętrznego serwera, zanim React wyświetli komponent ChildComp
.Jak czekać na odpowiedź AJAX i dopiero po tym renderować komponent?
Powyżej można zobaczyć drzewo odpowiedzi, która jest pochodzących z serwera. A to jest mój kod komponentu:
var ChildComp = React.createClass({
getInitialState: function(){
return {
response: [{}]
}
},
componentWillReceiveProps: function(nextProps){
var self = this;
$.ajax({
type: 'GET',
url: '/subscription',
data: {
subscriptionId: nextProps.subscriptionId //1
},
success: function(data){
self.setState({
response: data
});
console.log(data);
}
});
},
render: function(){
var listSubscriptions = this.state.response.map(function(index){
return (
index.id
)
});
return (
<div>
{listSubscriptions}
</div>
)
}
});
To działa dobrze, ale jeśli mogę zmienić swój powrót do:
return (
index.id + " " + index.order.id
)
id jest niezdefiniowany. I wszystkie inne właściwości przedmiotu zamówienia. Dlaczego tak jest? Jeśli I console.log
moja odpowiedź po success
funkcji daje wszystkie dane (jak na zdjęciu). Domyślam się, że tylko pierwsze obiekty są ładowane, gdy React renderuje komponent, a następnie ładowane są wszystkie inne wewnętrzne obiekty. Nie mogę powiedzieć, czy tak jest (brzmi tak dziwnie), ani nie mogę powiedzieć, jak rozwiązać ten problem.
Próbowałem też coś jak ten
success: function(data){
self.setState({
response: data
}, function(){
self.forceUpdate();
})
}.bind(this)
ale nadal ponowne renderowanie dzieje się przed moim console.log(data)
jest wyzwalany. Jak czekać na odpowiedź AJAX i dopiero po tym renderować komponent?
Aby upewnić się, że dane odpowiedzi są sformatowane zgodnie z potrzebami, należy dodać parametr 'dataType:" json "' do żądania ajax. Możesz także spróbować zarejestrować nowy stan, jaki został odebrany w 'shouldComponentUpdate'. I na koniec sprawdź, jakie - jeśli jakiekolwiek - właściwości znajdują się na 'index.order'. Być może zawiera ciąg znaków zamiast właściwości. –