You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React组件报错:TypeError: books.map is not a function 求助

解决React渲染书籍列表时的map函数错误

错误原因

你的API返回的JSON结构中,书籍数组嵌套在results字段下,但当前代码直接将整个响应数据对象(包含status和results)赋值给了books状态。这样books变成了对象而非数组,自然无法调用数组的map方法,从而抛出TypeError: books.map is not a function错误。

你的API响应示例:

{"status":"Success","results":[{"id":1,"name":"Tenzi Za Rohoni","language":"Kiswahili"}]}

当前代码里的setBooks(response.data)会让books等于这个完整对象,而非里面的results数组。

修复步骤

1. 修正状态赋值逻辑

修改useEffect中的回调,将response.data.results赋值给books:

useEffect(() => {
    listBooks().then((response) => {
        // 取results字段作为书籍数组
        setBooks(response.data.results);
    }).catch(error => {
        console.error(error);
        // 请求失败时重置为数组,避免后续map报错
        setBooks([]);
    })
}, [])

2. 添加渲染时的空值保护(可选但推荐)

为了避免数据未加载完成或请求失败时出现意外错误,可以在渲染map前添加判断,确保books是数组且有数据:

<tbody>
    {books && Array.isArray(books) && books.map(book =>
        <tr key={book.id}>
            <td>{book.id}</td>
            <td>{book.name}</td>
            <td>{book.language}</td>
        </tr>
    )}
</tbody>

3. 验证API响应格式(可选)

如果后端无法修改响应格式,确保前端始终正确解析即可。如果可以调整后端,也可以让API直接返回书籍数组,但不是必须的,前端正确解析即可。

完成上述修改后,books状态会正确存储书籍数组,就能正常调用map方法渲染列表了。

内容的提问来源于stack exchange,提问作者Emmanuel Kiprono

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 03:15:11