无法呈现 API 数据,使用 Google 书籍 API 时出现 .map 错误

Cant render API data, .map error using Google Books API

刚接触 React,仍在学习中。我试图使用 Google Books API 制作这个 Book Finder 应用程序,然后当我想映射数据时,第一次一切正常,但之后有一次我开始收到此错误:

请记住,我第一次 运行 代码一切正常时,我什至修复了一些 CSS 属性,它重新呈现得很好。 我尝试了很多东西,我知道你不能在对象上使用 .map,我检查过,API 数据是对象。

给定 API 数据的 typeof() 结果

代码如下:

MainContainer.tsx

import { useState } from "react";
import List from "./List";
import Search from "./Search";
import request from "superagent";

export default function MainContainer() {

    const [books, setBooks] = useState([]);

    function handleChange(e: any) {
        setBooks(e.target.value);
    }

    function handleSearch(e: any) {
        e.preventDefault();
        request
            .get("https://www.googleapis.com/books/v1/volumes")
            .query({ q: setBooks })
            .then((data) => {
                setBooks([...books])
            })
    }

    return (
        <div className="main-container">
            <Search
                handleChange={handleChange}
                handleSearch={handleSearch}
            />
            <List books={books}/>
        </div>
    )
}

List.tsx

import Card from "./Card"

export default function List(props: any) {

    return (
        <div className="list-container">

            {

                props.books && props.books.length > 0 ?
                    props.books.map(function (book: any) {
                        return (
                            <Card
                                key={book.id}
                                image={book.volumeInfo.imageLinks.smallThumbnail}
                                title={book.volumeInfo.title}
                                author={book.volumeInfo.authors}
                                published={book.volumeInfo.publishedDate}
                            />
                        )
                    }) : <p className="np-data">No books yet...</p>
            }

        </div>
    )
}

Card.tsx

export default function Card(props: any) {
    return (
        <div className="card">

            <img src={props.image} alt="" />
            <div className="card-desc">

                <h3 className="title">{props.title}</h3>
                <h4 className="author">{props.author}</h4>
                <p className="published">{props.published}</p>

            </div>

        </div>
    )
}

同样,我仍在学习 React,这可能是一些愚蠢的打字错误,所以是的。提前致谢!

问题是您在这里有两个状态(搜索查询和图书列表),但是您使用一个变量 (books) 来跟踪两者。

MainContainer 组件中,添加它以创建另一个状态变量。

const [query, setQuery] = useState('');

handleChange 更新为此以更新搜索查询变量。

function handleChange(e: any) {
  setQuery(e.target.value);
}

handleSearch 更新到此以使用上次输入的查询发出请求并正确设置 books 状态变量。

function handleSearch(e: any) {
  e.preventDefault();
  request
    .get("https://www.googleapis.com/books/v1/volumes")
    .query({ q: query})
    .then((data) => {
      setBooks(data.items)
    })
 }

现在应该可以正常工作了。