ในส่วนประกอบการตอบสนองของฉันฉันพยายามใช้สปินเนอร์แบบธรรมดาในขณะที่คำขอ ajax กำลังดำเนินการอยู่ - ฉันใช้สถานะเพื่อเก็บสถานะการโหลด
ด้วยเหตุผลบางประการโค้ดด้านล่างในองค์ประกอบการตอบสนองของฉันทำให้เกิดข้อผิดพลาดนี้
อัปเดตได้เฉพาะส่วนประกอบที่ติดตั้งหรือติดตั้งเท่านั้น โดยปกติจะหมายถึงคุณเรียกว่า setState () บนส่วนประกอบที่ไม่ได้ต่อเชื่อม นี่คือ no-op โปรดตรวจสอบรหัสสำหรับส่วนประกอบที่ไม่ได้กำหนด
หากฉันกำจัดการเรียก setState แรกข้อผิดพลาดจะหายไป
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>
);
}
คำถามคือเหตุใดฉันจึงได้รับข้อผิดพลาดนี้เมื่อส่วนประกอบควรถูกเมาท์อยู่แล้ว (เนื่องจากถูกเรียกจาก componentDidMount) ฉันคิดว่าการตั้งค่าสถานะเมื่อต่อคอมโพเนนต์นั้นปลอดภัยแล้วหรือไม่