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

React Material UI中Accordion点击获取对应数据失败问题排查

React MUI Accordion点击时item未定义的问题排查与解决

核心问题:作用域不匹配

你遇到的item未定义,本质是事件处理函数的作用域和遍历records时的item作用域不重叠。举个典型的错误写法:

// 错误示例
const handleClick = (e) => {
  console.log(item.attributes.id); // 这里的item不在当前作用域内,直接报错
};

return (
  <div>
    {records.map(item => (
      <Accordion key={item.attributes.id} onClick={handleClick}>
        <AccordionSummary>{item.attributes.name}</AccordionSummary>
      </Accordion>
    ))}
  </div>
);

map回调里的item只在当前循环的回调函数内有效,外部的handleClick根本访问不到这个变量,自然会提示未定义。


两种可行的解决方案

方案1:在map回调中直接传递item给处理函数

这是最直观的解决方式,在遍历的时候把当前item作为参数传入点击事件:

// 正确写法:将item作为参数传入
const handleClick = (item) => {
  console.log(item.attributes.id); // 正常获取目标id
};

return (
  <div>
    {records.map(item => (
      <Accordion 
        key={item.attributes.id} 
        onClick={() => handleClick(item)} // 这里直接把当前item传进去
      >
        <AccordionSummary>{item.attributes.name}</AccordionSummary>
      </Accordion>
    ))}
  </div>
);

如果需要同时获取事件对象,也可以一起传递:

onClick={(e) => handleClick(e, item)}

// 对应的处理函数
const handleClick = (e, item) => {
  console.log(e.target, item.attributes.id);
};

方案2:通过DOM dataset存储id(适合不需要完整item的场景)

如果只需要id而不是整个item对象,可以把id存在Accordion的data-*属性中,再从事件对象中读取:

const handleClick = (e) => {
  const targetId = e.currentTarget.dataset.id; // 从dataset中获取id
  console.log(targetId);
  // 如果需要对应item,可以从records中查找:
  const targetItem = records.find(item => item.attributes.id === targetId);
};

return (
  <div>
    {records.map(item => (
      <Accordion 
        key={item.attributes.id} 
        onClick={handleClick}
        data-id={item.attributes.id} // 存储id到dataset
      >
        <AccordionSummary>{item.attributes.name}</AccordionSummary>
      </Accordion>
    ))}
  </div>
);

额外注意点

  • 确保records中的每个item确实存在attributes.id字段,避免因数据本身缺失导致的报错;
  • 遍历生成Accordion时,必须设置唯一的key值,用item.attributes.id是合理的选择,不要用数组索引作为key。

内容的提问来源于stack exchange,提问作者Josh Winters

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 07:38:24