首页 > 解决方案 > 如何修复 React 中的“TypeError:categories.map 不是函数”错误

问题描述

我不断收到这个categories.map不是函数的错误,但我不明白为什么。我正在为从 API 调用接收的数据设置类别,但不断收到此错误。另外,有没有办法轻松调用父对象的子对象?API 数据嵌套了大约 4-5 层,并且它们都有不同的名称,那么我将如何遍历所有这些呢?

response.data控制台中的外观示例(打开了一些嵌套对象)

在此处输入图像描述

这是我的组件:

class Menu extends React.Component {
  state = {
    categories: []
  };

  componentDidMount() {
    axios
      .get("https://www.ifixit.com/api/2.0/categories")
      .then(response => this.setState({ categories: response.data }));
  } 

  render() {
    let categories = this.state.categories;
    return (
      <div>
        <ul>
          {categories.map((m, index) => {
            return (
              <li key={index}>
                {m.children && <Menu categories={m.children} />}
              </li>
            );
          })}
        </ul>
      </div>
    );
  }
}

export default Menu;

编辑:当我使用Object.keys它时,会出现错误“未捕获的不变违规:对象作为 React 子项无效(找到:带有键的对象...)”,然后列出我正在调用的对象中的所有键。有谁知道我如何调用该函数(可能是递归的?)以将其应用于对象中的所有对象?

这是我更新的代码:

class Menu extends React.Component {
  state = {
    collapsed: false,
    categories: []
  };

  componentDidMount() {
    axios
      .get("https://www.ifixit.com/api/2.0/categories")
      .then(response => this.setState({ categories: response.data}));
  } 

  render() {
    const { categories } = this.state;
    return (
      <div>
        {Object.keys(categories).map((item, i) => (
          <li key={i}>
            <span>{categories[item]}</span>
          </li>
        ))}
      </div>
    );
  }
}

export default Menu;

标签: javascriptjsonreactjsapidictionary

解决方案


您可以将您的属性对象映射到数组并处理它。

let result = Object.entries(data).map(( [k, v] ) => ({ [k]: v }));

改成

componentDidMount() {
    axios
      .get("https://www.ifixit.com/api/2.0/categories")
      .then(response => this.setState({ 
       categories: Object.entries(response.data).map(( [k, v] ) => ({ [k]: v }) }));
  } 

推荐阅读