我已將和token
存儲在state
的Parent
組件中。我將url
和token
作爲props
從父Component
傳遞給子Component
。但是,如果母公司Component
中有某個事件,則觸發setState()
,結果子Component
的componentDidUpdate()
被執行。
由於componentDidUpdate()
導致無限循環(因爲它觸發子組件內的setState()),我已經放置條件。但是這並不能防止錯誤。
輔元件即DisplayRevenue
如下:爲什麼componentDidUpdate()創建一個無限循環?
import React, { Component } from 'react';
import '../App.css';
import ListData from './listdata.js'
var axios = require('axios');
class DisplayRevenue extends Component {
constructor(props){
super(props);
this.state = { data:[], url:"" }
console.log(this.props.url);
}
componentWillMount() {
this.loadRevenue(this.props.url, this.props.token);
}
componentDidUpdate(){ //creates infinite loop
// console.log(this.props.url);
this.loadRevenue(this.props.url, this.props.token);
}
setData(data){
//if(this.state.url != this.props.url){
if(this.state.data != data.data){
console.log(data.data); //(1)
// console.log(this.state.url); //(2)
this.setState(data:data);
console.log(this.state.data); //(3)
// console.log(this.props.url); //(4)
} //(1) & (3) yields exactly same value so does (2) & (4)
}
loadRevenue(url,token){
axios({
method:'get',
url:url,
headers: {
Authorization: `Bearer ${token}`,
},
})
.then((response) => {
// console.log(response.data);
this.setData(response.data);
})
.catch(function (error) {
console.log("Error in loading Revenue "+error);
});
}
render() {
return (
<ListData data={this.state.data}/>
);
}
};
export default DisplayRevenue;
父組件即MonthToDate是如下:
import React, { Component } from 'react';
import '../App.css';
import DisplayRevenue from './displayRevenue'
var axios = require('axios');
class MonthToDate extends Component {
constructor(props){
super(props);
this.state = {
data:null,
url:"http://localhost:3000/api/monthtodate"
}
//console.log(this.props.location.state.token);
}
groupBySelector(event){
if ((event.target.value)==="invoice"){
this.setState({url:"http://localhost:3000/api/monthtodate"})
} else if ((event.target.value)==="customer") {
this.setState({url:"http://localhost:3000/api/monthtodate?group-by=customerNumber"})
} else if ((event.target.value)==="month") {
this.setState({url:"http://localhost:3000/api/invoices?group-by=month"})
} else {
this.setState({url:"http://localhost:3000/api/monthtodate"})
}
console.log(this.state.url);
}
render() {
return (
<div>
<select onChange={(event)=>this.groupBySelector(event)}>
<option value="invoice">GROUP BY INVOICE</option>
<option value="customer">GROUP BY CUSTOMER</option>
<option value="month">GROUP BY MONTH</option>
</select>
<DisplayRevenue url={this.state.url} token={this.props.location.state.token}/>
</div>
);
}
}
export default MonthToDate;
- 我缺少什麼?
- 此外,在我收到子組件中的
url
之後,我想根據url
呈現不同的組件。例如<ListData />
組件只能處理url
的一種類型。如何根據url
類型在render()
內呈現另一個組件?
爲什麼你在componentDidUpdate一個Axios公司的要求,將被執行的是愛可信要求對每一個渲染和進一步,因爲它確實的setState那張循環 –
要設置狀態這使得愛可信的呼叫和設置狀態,並導致組件更新,並設置狀態,並導致更新,並設置狀態,並導致更新,並設置狀態,並導致更新,並設置狀態,並導致更新和設置狀態,導致更新和設置狀態,並導致更新,並設置狀態.... – bennygenel
@ShubhamKhatri'setState()'裏面axios? axios正在調用'setData()',它在執行'setState()'之前檢查相等性' – noobie