Je souhaite rendre mon composant une fois ma demande ajax effectuée.
Ci-dessous vous pouvez voir mon code
var CategoriesSetup = React.createClass({
render: function(){
var rows = [];
$.get('http://foobar.io/api/v1/listings/categories/').done(function (data) {
$.each(data, function(index, element){
rows.Push(<OptionRow obj={element} />);
});
return (<Input type='select'>{rows}</Input>)
})
}
});
Mais j'obtiens l'erreur ci-dessous parce que je retourne rendre la méthode done de ma requête ajax.
Uncaught Error: Invariant Violation: CategoriesSetup.render(): A valid ReactComponent must be returned. You may have returned undefined, an array or some other invalid object.
Est-il possible d'attendre que ma demande ajax se termine avant de commencer le rendu?
Il y a deux façons de gérer cela, et celle que vous choisissez dépend du composant qui doit posséder les données et de l'état de chargement.
Déplacez la demande Ajax dans le parent et restituez le composant de manière conditionnelle:
var Parent = React.createClass({
getInitialState: function() {
return { data: null };
},
componentDidMount: function() {
$.get('http://foobar.io/api/v1/listings/categories/').done(function(data) {
this.setState({data: data});
}.bind(this));
},
render: function() {
if (this.state.data) {
return <CategoriesSetup data={this.state.data} />;
}
return <div>Loading...</div>;
}
});
Conservez la demande Ajax dans le composant et restituez quelque chose d'autre de façon conditionnelle pendant son chargement:
var CategoriesSetup = React.createClass({
getInitialState: function() {
return { data: null };
},
componentDidMount: function() {
$.get('http://foobar.io/api/v1/listings/categories/').done(function(data) {
this.setState({data: data});
}.bind(this));
},
render: function() {
if (this.state.data) {
return <Input type="select">{this.state.data.map(this.renderRow)}</Input>;
}
return <div>Loading...</div>;
},
renderRow: function(row) {
return <OptionRow obj={row} />;
}
});
L'exemple de base du rendu asynchrone des composants est présenté ci-dessous:
import React from 'react';
import ReactDOM from 'react-dom';
import PropTypes from 'prop-types';
export default class YourComponent extends React.PureComponent {
constructor(props){
super(props);
this.state = {
data: null
}
}
componentDidMount(){
const data = {
optPost: 'userToStat01',
message: 'We make a research of fetch'
};
const endpoint = 'http://example.com/api/phpGetPost.php';
const setState = this.setState.bind(this);
fetch(endpoint, {
method: 'POST',
body: JSON.stringify(data)
})
.then((resp) => resp.json())
.then(function(response) {
setState({data: response.message});
});
}
render(){
return (<div>
{this.state.data === null ?
<div>Loading</div>
:
<div>{this.state.data}</div>
}
</div>);
}
}