【发布时间】:2020-04-07 07:53:16
【问题描述】:
所以我有以下 3 个功能。一个包含对正在获取请求的两个 (getBooks) 的调用。我在调用前将状态 (isLoading) 设置为 true,然后在调用后设置为 true。这也是为了确保正确加载数据。但是状态没有更新,因此,我的 get 请求数据无效。我的 setstate 中的回调在我的其他组件中工作,所以我很困惑。以下是我的 3 个函数。
import React from 'react';
import ReactDOM from 'react-dom';
import SidePane from './SidePane.js';
import HomeNavBar from './HomeNavBar.js';
import axios from 'axios';
import qs from 'qs';
import Loading from './Loading.js';
class HomePage extends React.Component {
constructor(props) {
super(props);
this.state = {
bookSearch: "",
bookSearchResults: [],
bookSearchFound: false,
isLoading: false
};
this.handleSearch = this.handleSearch.bind(this);
this.alertBookName = this.alertBookName.bind(this);
this.getBooksFromIsbn = this.getBooksFromIsbn.bind(this);
this.getBooks = this.getBooks.bind(this);
axios.defaults.withCredentials = true;
}
changeBookName = (e) => {
var bookName = e.target.value;
bookName = bookName.split(' ').join('+');
this.setState({bookSearch: bookName})
}
getBooksFromIsbn(isbns){
var books = [];
axios
.get('http://localhost:9000/api/getBooksFromIsbn',
{
params: {
books: JSON.stringify(isbns)
}
})
.then(res =>
{
console.log(res.data);
books = res.data;
})
.catch(error => {
console.log(error.response);
});
}
getBooks(){
this.setState({
isLoading: true
},
function(){console.log("setState completed", this.state)}
);
var bookResults = this.handleSearch();
var books = this.getBooksFromIsbn(bookResults);
this.setState({
isLoading: false
},
function(){console.log("setState completed", this.state)}
);
this.props.setBookSearchResults(books);
}
handleSearch(){
var bookResults = [];
var url = 'http://localhost:9000/api/getOpenLibrarySearch';
axios
.get(url,
{
params: {
bookSearch: this.state.bookSearch
}
})
.then(res =>
{
//this.setState({bookSearchResults: res.data});
for(var i=0; i < res.data.docs[i].isbn.length; i++){
bookResults = bookResults.concat(res.data.docs[i].isbn);
}
console.log(bookResults);
})
.catch(error => {
console.log(error.response);
});
return bookResults;
}
render(){
if(this.state.isLoading == false){
return(
<div>
<HomeNavBar authToken = {this.props.authToken} email = {this.props.email} />
<SidePane changeBookName = {this.changeBookName} handleSearch = {this.getBooks} />
</div>
)
}
else
{
return <Loading />;
}
}
}
【问题讨论】:
-
“然而状态没有更新”——当你将它从
true“改变”到true时,为什么你期望它更新? -
旁白:
handleSearch总是返回一个空数组,getBooksFromIsbn总是返回undefined。 -
能否请您显示整个组件,需要知道何时调用 getBooks。此外,如果可以,请在代码和框中制作工作示例。
-
@Quentin 抱歉,我实际上将它们都设置为 true 只是为了查看是否会更改它们,因为 isLoading 默认为 false。我更新了上面的代码
-
@Quentin 你能给我一些关于如何不让它们返回为空和未定义的见解吗?
标签: javascript reactjs axios