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

React遍历results状态时报map is not a function错误

问题表现

运行代码抛出异常:results.map is not a function,控制台提示可在组件树中添加error boundary自定义错误处理行为。
问题报错截图
对名为results的state做遍历渲染时会持续触发该报错,已知map是数组的标准内置方法,但现有逻辑始终无法正常运行。

相关代码

App.js

import "./App.css";
import React, { useEffect, useState } from "react";
import ContactCard from "./ContactCard";

const App = () => {
  const [results, setResults] = useState([]);

  useEffect(() => {
    fetch("https://randomuser.me/api/?results=5")
      .then((response) => response.json())
      .then((data) => {
        console.log(data);
        setResults(data);
      });
  }, []);

  return (
    <div>
      {results.map((result, i) => {
        return (
          <ContactCard
            key={i}
            avatarUrl={result.picture.large}
            name={result.name}
            email={result.email}
            age={result.dob.age}
          />
        );
      })}
    </div>
  );
};
export default App;

ContactCard.js

import React, { useState } from "react";

const ContactCard = (props) => {
  const [showAge, setShowAge] = useState(false);
  const showAgefn=()=>{
    setShowAge(!showAge)
  }

  return (
    <div className="contact-card">
      <img src={props.avatarUrl} alt="profile" />
      <div className="user-details">
        <p>Name: {props.name}</p>
        <p>Email: {props.email}</p>
        <button onClick={showAgefn}>Show age</button>
        {showAge && <p>Age: {props.age}</p>} 
      </div>
    </div>
  );
};

export default ContactCard;
报错根因

randomuser接口返回的data是完整响应对象,真正的用户列表存在data.results数组字段下,当前代码直接把整个响应对象赋值给了results状态。results初始值是数组,但被赋值成对象后,对象本身没有map方法,调用自然报错。
另外代码还有个隐藏问题:接口返回的name字段是包含头衔、名、姓的对象,直接传进组件渲染会显示[object Object],无法展示正常人名。

修复方法
  • 修改fetch回调中的状态赋值逻辑,取响应中真正的用户数组赋值:将setResults(data)改为setResults(data.results)
  • 增加防御性判断,渲染前先校验results是否为数组,避免接口返回异常时触发同类报错,同时修正姓名字段的拼接逻辑,核心修改后的渲染代码如下:
return (
  <div>
    {Array.isArray(results) && results.map((result, i) => {
      const fullName = `${result.name.title} ${result.name.first} ${result.name.last}`
      return (
        <ContactCard
          key={i}
          avatarUrl={result.picture.large}
          name={fullName}
          email={result.email}
          age={result.dob.age}
        />
      );
    })}
  </div>
)
  • 长期优化建议:在应用外层添加Error Boundary错误边界组件,捕获子组件渲染、运行阶段的异常,配置降级展示逻辑,避免单个组件报错导致整个页面白屏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 03:27:31