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

React运行HorizontalScrollbar组件报data.map is not a function错误

问题描述

React项目中通过props向HorizontalScrollbar组件传递data参数调用组件时,Chrome浏览器控制台抛出错误:
Uncaught TypeError: data.map is not a function

相关代码片段

HorizontalScrollbar.js 组件源码

import React from 'react';
import {Box} from '@mui/material';

const HorizontalScrollbar = ({data}) => {
    return (
        <div> 
           {data.map((item) => ( 
            <Box 
            key = {item.id || item}
            itemId = {item.id || item}
            title = {item.id || item}
            m = "0 40px"
            >
            {item}
            </Box>
            )
        )
            
    }
        </div>
)
}

export default HorizontalScrollbar;

父组件传递data prop的代码

<Box sx = {{position: "relative", width: "100%", p: "20px"}}>
    <HorizontalScrollbar data = {bodyParts} />
</Box>
错误产生原因

map是数组原型上的遍历方法,报错说明组件渲染时接收到的data(即父组件传入的bodyParts)不是数组类型。
绝大多数触发场景是:bodyParts是异步接口返回的数据,初始值被设置为null、undefined、普通对象等非数组类型,组件首次渲染时接口数据还未返回,直接对非数组值调用map方法就会抛出该错误。少数情况是接口返回的数据本身不是数组类型,未做校验就直接传给了组件。

修复方案
  • 给组件props加默认值兜底:在解构data参数时设置默认值为空数组,即使父组件未传值、或者传值为undefined,也能保证data始终是数组类型。修改后的组件核心代码如下:
// 给data设置默认空数组
const HorizontalScrollbar = ({data = []}) => {
    return (
        <div> 
           {data.map((item) => ( 
            <Box 
              key={item.id || item}
              itemId={item.id || item}
              title={item.id || item}
              m="0 40px"
            >
              {item}
            </Box>
           ))}
        </div>
    )
}
  • 修正父组件的数据源逻辑:如果bodyParts是state存储的异步数据,初始化时必须将默认值设为空数组[],不要设置为null、{}等非数组值;接口返回数据后先做类型校验,确认是数组再赋值,避免异常数据传入组件。参考写法:
// state初始值设为空数组
const [bodyParts, setBodyParts] = useState([]);

// 接口请求逻辑加类型兜底
const loadBodyParts = async () => {
  const response = await fetch('对应接口地址');
  const result = await response.json();
  // 校验返回结果为数组再赋值,否则兜底为空数组
  setBodyParts(Array.isArray(result) ? result : []);
}
  • 可选加固:在组件内增加类型判断,仅当data是数组时才执行map遍历,进一步避免异常数据导致的页面崩溃:
const HorizontalScrollbar = ({data}) => {
    return (
        <div> 
           {Array.isArray(data) && data.map((item) => ( 
            <Box 
              key={item.id || item}
              itemId={item.id || item}
              title={item.id || item}
              m="0 40px"
            >
              {item}
            </Box>
           ))}
        </div>
    )
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 06:57:24