W moim komponencie reagowania próbuję zaimplementować prosty spinner, gdy trwa żądanie Ajax - używam stanu do przechowywania statusu ładowania.
Z jakiegoś powodu ten fragment kodu poniżej w moim komponencie React zgłasza ten błąd
Może aktualizować tylko zamontowany lub montowany komponent. Zwykle oznacza to, że wywołałeś setState () na niezmontowanym komponencie. To nie jest operacja. Sprawdź kod niezdefiniowanego komponentu.
Jeśli pozbędę się pierwszego wywołania setState, błąd zniknie.
constructor(props) {
super(props);
this.loadSearches = this.loadSearches.bind(this);
this.state = {
loading: false
}
}
loadSearches() {
this.setState({
loading: true,
searches: []
});
console.log('Loading Searches..');
$.ajax({
url: this.props.source + '?projectId=' + this.props.projectId,
dataType: 'json',
crossDomain: true,
success: function(data) {
this.setState({
loading: false
});
}.bind(this),
error: function(xhr, status, err) {
console.error(this.props.url, status, err.toString());
this.setState({
loading: false
});
}.bind(this)
});
}
componentDidMount() {
setInterval(this.loadSearches, this.props.pollInterval);
}
render() {
let searches = this.state.searches || [];
return (<div>
<Table striped bordered condensed hover>
<thead>
<tr>
<th>Name</th>
<th>Submit Date</th>
<th>Dataset & Datatype</th>
<th>Results</th>
<th>Last Downloaded</th>
</tr>
</thead>
{
searches.map(function(search) {
let createdDate = moment(search.createdDate, 'X').format("YYYY-MM-DD");
let downloadedDate = moment(search.downloadedDate, 'X').format("YYYY-MM-DD");
let records = 0;
let status = search.status ? search.status.toLowerCase() : ''
return (
<tbody key={search.id}>
<tr>
<td>{search.name}</td>
<td>{createdDate}</td>
<td>{search.dataset}</td>
<td>{records}</td>
<td>{downloadedDate}</td>
</tr>
</tbody>
);
}
</Table >
</div>
);
}
Pytanie brzmi, dlaczego otrzymuję ten błąd, gdy komponent powinien być już zamontowany (jak jest wywoływany z componentDidMount). Myślałem, że można bezpiecznie ustawić stan po zamontowaniu komponentu?