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

React MUI传数组渲染菜单链接报错items.map is not a function

报错根因

控制台抛出items.map is not a function和MUI组件本身无关,核心是数组定义的语法写错了:
你当前写的const [items] = ([{name:'John', href:'xxx'}])使用了数组解构赋值语法,最终items拿到的是数组内的第一个对象,而非整个数组,对象类型没有map方法,直接调用就会触发报错。

修复步骤

1. 修正数组定义

如果菜单是不需要动态修改的静态内容,直接定义普通数组常量即可,不要加解构用的方括号:

// 静态菜单正确写法
const items = [
  {
    name: 'John',
    href: '/test-page' // 替换为你自己的页面路径
  }
];

如果后续需要动态增删改菜单项,用React useState定义响应式状态:

// 动态菜单正确写法
const [items, setItems] = React.useState([
  {
    name: 'John',
    href: '/test-page'
  }
]);

2. 修正列表渲染的key值

你移动端菜单循环写的key={item}是错误写法,React要求key必须是字符串/数字类型的唯一标识,直接传对象会触发渲染警告,改成和桌面端一致,用唯一的name字段即可:

<List>
  {items.map(item => (
    <ListItem key={item.name} disablePadding>
      <ListItemButton component="a" href={item.href} sx={{ textAlign: 'center' }}>
          <ListItemText primary={item.name} />
      </ListItemButton>
    </ListItem>
  ))}
</List>

3. 补全桌面端菜单的跳转属性

你当前桌面端渲染的Button组件没有绑定href,无法实现跳转,补上对应属性即可:

<Box sx={{ display: { xs: 'none', sm: 'block' } }}>
  {items.map(item => (
    <Button key={item.name} href={item.href} sx={{ color: '#fff' }}>
      {item.name}
    </Button>
  ))}
</Box>

4. 补全缺失的宽度常量

代码里Drawer的样式用到了drawerWidth变量,如果没有提前声明会触发未定义报错,直接给抽屉设置固定宽度即可,常用值为240px:

sx={{
  display: { xs: 'block', sm: 'none' },
  '& .MuiDrawer-paper': { boxSizing: 'border-box', width: 240 },
}}
补充说明

通过map循环向MUI组件注入数组渲染的逻辑和写原生语义化HTML没有区别,只要保证调用map的变量是数组类型,将对应字段正确传给组件的props属性即可,组件本身不会对循环渲染做特殊限制。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 21:21:32