如何修复 React 中的“TypeError:categories.map 不是函数”错误

Posted

技术标签:

【中文标题】如何修复 React 中的“TypeError:categories.map 不是函数”错误【英文标题】:How to fix "TypeError: categories.map is not a function" error in React 【发布时间】:2019-09-21 12:14:54 【问题描述】:

我不断收到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;

【问题讨论】:

您可以通过控制台记录响应吗?我相信类别是作为对象而不是数组返回的,因此,您会收到该错误 看起来您的响应数据是一个带有键值对的对象key: valuemap 方法仅适用于数组类型。您可能想改用for(let m in categories) 【参考方案1】:

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

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 ) ));
   

【讨论】:

我明白了,我认为我从来没有使用过 map 函数而不是数组,所以我没有意识到这是一个问题。非常感谢! 当我这样做时,它给了我错误“未捕获的不变违规:对象作为 React 子项无效(找到:带键的对象...”,然后列出我正在调用的对象。您知道如何递归调用我的组件以应用于对象中的所有对象吗?【参考方案2】:

问题在于response.data 不是array,而是json 对象。

您可以使用以下代码基于键进行映射:

Object.keys(categories).map((key, index) => 
  console.log(categories[key]);
);

【讨论】:

以上是关于如何修复 React 中的“TypeError:categories.map 不是函数”错误的主要内容,如果未能解决你的问题,请参考以下文章

如何修复 React Native 中的 Firebase/firestore 错误?

如何修复由 react-redux 中的循环依赖引起的“不变违规”

如何修复React.js中的箭头功能来处理道具

如何修复 React 中的“TypeError:categories.map 不是函数”错误

如何修复React-Native中的“路由组件'Principal'必须是React组件”错误

如何修复 Android Studio 中的 React Native 应用程序错误?