【问题标题】:React setState callback won't update stateReact setState 回调不会更新状态
【发布时间】: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


【解决方案1】:

看起来您实际上需要从getBooksFromIsbn 返回books 值。等待axios调用解析,返回books

async getBooksFromIsbn (isbns) {
  const books = [];

  try {
    const res = await axios.get(
      'http://localhost:9000/api/getBooksFromIsbn',
      {
        params: {
          books: JSON.stringify(isbns)
        }
      });
    books = res.data;
  } catch(error) {
    console.log(error.response);
  }

  return books; 
}

handleSearch同理,代码需要等待返回GET请求的解析。

【讨论】:

  • 我将函数更改为异步并等待对 handleSearch 和 getBooksFromIsbn 的调用,但是返回的书籍最终未定义
猜你喜欢
  • 2019-01-28
  • 1970-01-01
  • 2020-01-30
  • 2022-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-20
相关资源
最近更新 更多