多个 Axios 请求进入 ReactJS 状态
Multiple Axios Requests Into ReactJS State
所以我一直在我的 React JS 组件中放置以下代码,我基本上是在尝试将两个 API 调用都置于一个名为 vehicles
的状态,但是我收到以下错误代码:
componentWillMount() {
// Make a request for vehicle data
axios.all([
axios.get('/api/seat/models'),
axios.get('/api/volkswagen/models')
])
.then(axios.spread(function (seat, volkswagen) {
this.setState({ vehicles: seat.data + volkswagen.data })
}))
//.then(response => this.setState({ vehicles: response.data }))
.catch(error => console.log(error));
}
现在我猜我不能像我有的那样添加两个数据源 this.setState({ vehicles: seat.data + volkswagen.data })
但是还有什么方法可以做到这一点?我只想将来自 API 请求的所有数据都置于一个状态。
这是我收到的当前错误:
TypeError: Cannot read property 'setState' of null(…)
谢谢
您不能 "add" 排列在一起。使用 array.concat 函数 (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/concat) 将两个数组连接成一个,然后将其设置为状态。
componentWillMount() {
// Make a request for vehicle data
axios.all([
axios.get('/api/seat/models'),
axios.get('/api/volkswagen/models')
])
.then(axios.spread(function (seat, volkswagen) {
let vehicles = seat.data.concat(volkswagen.data);
this.setState({ vehicles: vehicles })
}))
//.then(response => this.setState({ vehicles: response.data }))
.catch(error => console.log(error));
}
这有两个问题:
1) 在你的 .then 中 "this" 是未定义的,所以你需要在顶层存储对此的引用。
2) 正如另一个答案所述,您不能像那样在 JS 中将数组添加在一起并且需要使用 concat,尽管由于它们是服务器响应我也会添加一个默认值以阻止它出错如果这些实际上都不是return你的东西。
总的来说,我认为它应该是这样的:
componentWillMount() {
// Make a request for vehicle data
var that = this;
axios.all([
axios.get('/api/seat/models'),
axios.get('/api/volkswagen/models')
])
.then(axios.spread(function (seat, volkswagen) {
var seatData = seat.data || [];
var volkswagenData = volkswagen.data || [];
var vehicles = seatData.concat(volkswagenData);
that.setState({ vehicles: vehicles })
}))
.catch(error => console.log(error));
}
constructor(){
super();
this.state = {};
}
componentDidMount(){
axios.all([
axios.post('http://localhost:1234/api/widget/getfuel'),
axios.post('http://localhost:1234/api/widget/getdatarate')
])
.then(axios.spread((fuel,datarate) => {
this.setState({
fuel:fuel.data.data[0].fuel,
datarate:datarate.data.data[0].data
})
console.log(this.state.fuel)
console.log(this.state.datarate)
}))
}
我想说点不同的。根据反应生命周期,你应该更喜欢在componentDidMount()
方法中调用api。
"componentDidMount() is invoked immediately after a component is mounted. Initialization that requires DOM nodes should go here. If you need to load data from a remote endpoint, this is a good place to instantiate the network request."
https://reactjs.org/docs/react-component.html#componentdidmount
所以我一直在我的 React JS 组件中放置以下代码,我基本上是在尝试将两个 API 调用都置于一个名为 vehicles
的状态,但是我收到以下错误代码:
componentWillMount() {
// Make a request for vehicle data
axios.all([
axios.get('/api/seat/models'),
axios.get('/api/volkswagen/models')
])
.then(axios.spread(function (seat, volkswagen) {
this.setState({ vehicles: seat.data + volkswagen.data })
}))
//.then(response => this.setState({ vehicles: response.data }))
.catch(error => console.log(error));
}
现在我猜我不能像我有的那样添加两个数据源 this.setState({ vehicles: seat.data + volkswagen.data })
但是还有什么方法可以做到这一点?我只想将来自 API 请求的所有数据都置于一个状态。
这是我收到的当前错误:
TypeError: Cannot read property 'setState' of null(…)
谢谢
您不能 "add" 排列在一起。使用 array.concat 函数 (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/concat) 将两个数组连接成一个,然后将其设置为状态。
componentWillMount() {
// Make a request for vehicle data
axios.all([
axios.get('/api/seat/models'),
axios.get('/api/volkswagen/models')
])
.then(axios.spread(function (seat, volkswagen) {
let vehicles = seat.data.concat(volkswagen.data);
this.setState({ vehicles: vehicles })
}))
//.then(response => this.setState({ vehicles: response.data }))
.catch(error => console.log(error));
}
这有两个问题:
1) 在你的 .then 中 "this" 是未定义的,所以你需要在顶层存储对此的引用。
2) 正如另一个答案所述,您不能像那样在 JS 中将数组添加在一起并且需要使用 concat,尽管由于它们是服务器响应我也会添加一个默认值以阻止它出错如果这些实际上都不是return你的东西。
总的来说,我认为它应该是这样的:
componentWillMount() {
// Make a request for vehicle data
var that = this;
axios.all([
axios.get('/api/seat/models'),
axios.get('/api/volkswagen/models')
])
.then(axios.spread(function (seat, volkswagen) {
var seatData = seat.data || [];
var volkswagenData = volkswagen.data || [];
var vehicles = seatData.concat(volkswagenData);
that.setState({ vehicles: vehicles })
}))
.catch(error => console.log(error));
}
constructor(){
super();
this.state = {};
}
componentDidMount(){
axios.all([
axios.post('http://localhost:1234/api/widget/getfuel'),
axios.post('http://localhost:1234/api/widget/getdatarate')
])
.then(axios.spread((fuel,datarate) => {
this.setState({
fuel:fuel.data.data[0].fuel,
datarate:datarate.data.data[0].data
})
console.log(this.state.fuel)
console.log(this.state.datarate)
}))
}
我想说点不同的。根据反应生命周期,你应该更喜欢在componentDidMount()
方法中调用api。
"componentDidMount() is invoked immediately after a component is mounted. Initialization that requires DOM nodes should go here. If you need to load data from a remote endpoint, this is a good place to instantiate the network request."
https://reactjs.org/docs/react-component.html#componentdidmount