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

React类组件报错:this.state.articles.map不是函数的解决方法及原因

解决React类组件中map调用报错:Uncaught TypeError: this.state.articles.map is not a function

错误原因

  • 初始状态类型不匹配:你将articles的初始值设为了空字符串'',但map是数组专属方法,字符串没有该方法。组件首次渲染时,API请求还未完成,会直接使用初始状态的字符串调用map,触发类型错误。
  • 潜在风险:如果API返回的parseData.articles不是数组(比如返回null/undefined或对象),即使初始状态正确,后续也可能触发同样报错。

修复步骤

  1. 修正初始状态类型:将articles初始值改为空数组[],确保首次渲染时map调用在合法对象上执行。
  2. 添加渲染前校验:在调用map前判断articles是否为数组,避免API返回异常数据导致报错。
  3. 移除不必要的绑定:类组件的生命周期方法componentDidMount默认已绑定this,无需手动执行bind操作。

修改后的完整代码

import React, { Component } from "react";
import Newscompo from "./Newscompo";

class App extends Component {
  constructor(props) {
    super(props);
    console.log('this is constructor');
    // 修正初始状态为数组
    this.state = { articles: [] };
    // 移除不必要的绑定代码
  }

  async componentDidMount() {
    console.log('fetch the api now');
    let url = "https://newsapi.org/v2/top-headlines?sources=techcrunch&apiKey=9c1cd38&pageSize=1";
    let data = await fetch(url);
    let parseData = await data.json();
    console.log('The api is');
    // 可选:校验返回的articles是否为数组,再更新状态
    if (Array.isArray(parseData.articles)) {
      this.setState({ articles: parseData.articles });
    }
  }

  render() {
    return (
      <div>
        <div className="container  my-5">
          <div className="row ">
            <h2>Pratice-Headlines</h2>
            {/* 添加数组校验后再调用map */}
            {Array.isArray(this.state.articles) && this.state.articles.map((obj) => {
              // 这里返回你的Newscompo组件,比如:
              return <Newscompo key={obj.url} article={obj} />;
            })}
          </div>
        </div>
      </div>
    );
  }
}

export default App;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 02:50:02